• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Symfony2/Doctrine关系映射

mysql 来源:Manuel 4次浏览

我正在用syfmony2框架构建我的第一个应用程序。 现在我坚持一点关于如何从我的数据库中获取数据。Symfony2/Doctrine关系映射

首先这里我表(唯一重要的领域)

#客户

CUSTOMER_ID | INT | AI | PK

#文章

的article_id | INT | AI | PK

number | VARCHAR

#customer_article(这两个领域打造PK)

CUSTOMER_ID | INT | PK

article_id | INT | PK

现在我想执行一个简单的查询是这样的:

SELECT 
    ca.article_id, a.number 
FROM 
    customer_article AS ca 
LEFT JOIN 
    article AS a ON a.article_id = ca.article_id 
WHERE 
    ca.customer_id = {customer_id} 

据我了解文档最好的办法是 使关系映射在我的实体PHP文件。

Customer.php

Article.php

CustomerArticle.php

但我很困惑,做什么和在哪个方向。 (http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html)

在我看来,这一定是正确的关系

客户到CustomerArticle是一个一对多(单向)关系

CustomerArticle到客户是多到一(单向)关系

文章CustomerArticle是一个一对多(单向)关系

CustomerArticle条是多到一(裁研ectional)Relationship

在这一点上它是正确的吗?

现在是否需要在每个 实体文件中进行此(4)关系映射?或者我只需要做一个方法,例如 客户向CustomerArticle(一到多 – 单向)和 文章CustomerArticle(一到多 – 单向)

不幸的是,“一到五月,单向”是唯一一个没有 正确在学说参考页上的例子。

他们写道: “从主义的角度来看,它是简单地映射为一个单向多到很多,其中连接列上的一个独特的约束强制一对多基数”

这是否意味着我只需要在页面上的“单向多对多”部分进行映射?

很抱歉有很多问题。

我阅读了大量的单证,但我不能回答这些问题我自己。

感谢您的任何帮助。

更新2013年4月26日

不幸的是我不能让它甚至与Lighthart的帮助和阅读文档学说工作。

我认为这是有益的给你关于我的表和代码的更多细节。也许有人可以给我必要的答案,所以我最终理解它背后的概念。

我的一些示例表中的条目

Table: customer (PK: customer_id) 
+-------------+--------+----------+-------------------+------+-----------+ 
| customer_id | number | password | email    | salt | is_active | 
+-------------+--------+----------+-------------------+------+-----------+ 
| 1   | CU0001 | 43t9wef | [email protected] | test | 1   | 
| 2   | CU0002 | 32rk329 | [email protected] | test | 1   | 
+-------------+--------+----------+-------------------+------+-----------+ 

Table: article (PK: article_id) 
+-------------+---------+ 
| article_id | number | 
+-------------+---------+ 
| 1   | TEST-01 | 
| 2   | TEST-02 | 
| 3   | TEST-03 | 
| 4   | TEST-04 | 
| 5   | TEST-05 | 
+-------------+---------+ 

,因为我的第一份工作我做了什么?

  • 删除CustomerArticle.php
  • 删除customer_article表
  • 添加一个多对多的关系给客户(和文章)实体

这是实体文件什么样子的此刻(无方法)

Customer.php

<?php 
namespace Test\ExampleBundle\Entity; 

use Symfony\Component\Security\Core\User\UserInterface; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="customer") 
*/ 
class Customer implements UserInterface 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $customer_id; 

/** 
* @ORM\ManyToMany(targetEntity="Article", inversedBy="customers") 
* @ORM\JoinTable(name="customer_article", 
* joinColumns={ @ORM\JoinColumn(name="customer_id", referencedColumnName="customer_id") } 
*) 
*/ 
private $articles; 

/** 
* @ORM\Column(type="string", length=255, nullable=false, unique=true) 
*/ 
protected $number; 

/** 
* @ORM\Column(type="string", length=255, nullable=false) 
*/ 
protected $password; 

/** 
* @ORM\Column(type="string", length=255, nullable=true) 
*/ 
protected $email; 

/** 
* @ORM\Column(type="string", length=255) 
*/ 
protected $salt; 

/** 
* @ORM\Column(name="is_active", type="boolean") 
* 
*/ 
protected $isActive; 

// ... methods 
} 

Article.php

<?php 
namespace Test\ExampleBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="article") 
*/ 
class Article 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $article_id; 

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="articles") 
*/ 
private $customers; 

/** 
* @ORM\Column(type="string", length=255, nullable=false, unique=true) 
*/ 
protected $number; 

// ... methods 
} 

当我尝试执行:

php app/console doctrine:schema:update --force 

我得到以下信息

[Doctrine\ORM\ORMException] 
Column name `id` referenced for relation from Test\ExampleBundleBundle\Entity\Customer towards Test\ExampleBundleBundle\Entity\Article does not exist. 

我不知道为什么学说希望使用列名“id”。我读了一些关于这个错误的信息,并添加了“JoinColumns”代码,但它没有帮助。

我的目标是什么?

我从某些csv文件导入数据到表中: “customer”,“article”以及当前不存在的表“customer_article”中。

在我的应用程序中,每个客户都有一些引用他的文章。 因此该表将看起来像这样

customer_article 
+-------------+------------+ 
| customer_id | article_id | 
+-------------+------------+ 
| 1   | 1   | 
| 1   | 2   | 
| 1   | 5   | 
| 2   | 2   | 
| 2   | 5   | 
+-------------+------------+ 

这不是一个店铺或类似这样的东西。要解释这一点非常困难,因为只有知道每个客户都有未定义数量的相关文章才是必要的。

现在,我必须能够通过customer_id获得所有与一位顾客相关的物品。 (看看我上面的起始帖子中的示例sql语句)

我希望你能帮助我。

非常感谢大家。

===========解决方案如下:

这真的看起来像客户和文章多对多。您要构建的实体是Customer.php和Article.php,您可以通过注释在这些文件中指定多对多,或者根据您的偏好在doctrine.orm.yml中指定多对多。

主义将为您制作中间表(customer_article)并对其进行管理。

你会使用DQL:

$query = $em->createQuery("SELECT a FROM Article a JOIN a.customer c"); 
$users = $query->getResult(); 

然后,你会处理文章为实体,并调用article.getCustomer()用于与商品相关的客户名单。

这是一个与SQL根本不同的范例,需要一些习惯。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)