Symfony2/Doctrine关系映射
我正在用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根本不同的范例,需要一些习惯。
回答:
您的映射不好。您指定了连接表,但不指定反向连接列。尝试:
/** * @ManyToMany(targetEntity="Article")
* @JoinTable(name="customer_article",
* joinColumns={@JoinColumn(name="Customer_id", referencedColumnName="cusomter_id")},
* inverseJoinColumns={@JoinColumn(name="Article_id", referencedColumnName="article_id")}
* )
*/
另外,将主键映射到'id'以外的东西有点不寻常。
以上是 Symfony2/Doctrine关系映射 的全部内容, 来源链接: utcz.com/qa/262803.html