我想知道在Doctrine2中使用多对多关系的最好,最干净,最简单的方法是什么.
让我们假设我们有一张专辑,如Metallica的Master of Puppets,有几首曲目.但请注意,一首曲目可能会出现在一张专辑中,比如Metal by Metallica的专辑 - 三张专辑都是这首曲目.
所以我需要的是专辑和曲目之间的多对多关系,使用第三个表和一些额外的列(比如指定专辑中曲目的位置).实际上,我必须使用,如Doctrine的文档所示,实现该功能的双重一对多关系.
/** @Entity() */
class Album {
/** @Id @Column(type="integer") */
protected $id;
/** @Column() */
protected $title;
/** @OneToMany(targetEntity="AlbumTrackReference", mappedBy="album") */
protected $tracklist;
public function __construct() {
$this->tracklist = new \Doctrine\Common\Collections\ArrayCollection();
}
public function getTitle() {
return $this->title;
}
public function getTracklist() {
return $this->tracklist->toArray();
}
}
/** @Entity() */
class Track {
/** @Id @Column(type="integer") */
protected $id;
/** @Column() */
protected $title;
/** …
Run Code Online (Sandbox Code Playgroud) 我试图做一个简单的例子,以便学习如何从父表中删除一行,并使用Doctrine2自动删除子表中的匹配行.
这是我正在使用的两个实体:
Child.php:
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="child")
*/
class Child {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
*
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="father_id", referencedColumnName="id")
* })
*
* @var father
*/
private $father;
}
Run Code Online (Sandbox Code Playgroud)
Father.php
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="father")
*/
class Father
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
Run Code Online (Sandbox Code Playgroud)
这些表是在数据库上正确创建的,但是没有创建On Delete Cascade选项.我究竟做错了什么?
我正在使用Doctrine的QueryBuilder来构建查询,我想从查询中获得结果的总数.
$repository = $em->getRepository('FooBundle:Foo');
$qb = $repository->createQueryBuilder('n')
->where('n.bar = :bar')
->setParameter('bar', $bar);
$query = $qb->getQuery();
//this doesn't work
$totalrows = $query->getResult()->count();
Run Code Online (Sandbox Code Playgroud)
我只想对此查询运行计数以获取总行数,但不返回实际结果.(在此计数查询之后,我将使用maxResults进一步修改查询以进行分页.)
我findBy()
在Doctrine存储库上使用该方法:
$entities = $repository->findBy(array('type'=> 'C12'));
Run Code Online (Sandbox Code Playgroud)
我该如何订购结果?
我有以下代码,它给我错误:
Message: Invalid parameter number: number of bound variables does not match number of tokens
Run Code Online (Sandbox Code Playgroud)
码:
public function getCount($ids, $outcome)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', $qb->expr()->count('r.id'))
->add('from', '\My\Entity\Rating r');
if ($outcome === 'wins') {
$qb->add('where', $qb->expr()->in('r.winner', array('?1')));
}
if ($outcome === 'fails') {
$qb->add('where', $qb->expr()->in('r.loser', array('?1')));
}
$qb->setParameter(1, $ids);
$query = $qb->getQuery();
//die('q = ' . $qb);
return $query->getSingleScalarResult();
}
Run Code Online (Sandbox Code Playgroud)
数据(或$ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571 …
Run Code Online (Sandbox Code Playgroud) 我刚读完所有的Doctrine 2文档,我开始自己的沙盒,我理解了大部分的原理,但仍有一个问题,我在文档中找不到任何完整的解释.
Proxy
课程?据我所知,代理类添加了一个层,让您可以向实体添加一些其他功能,但为什么要使用代理而不是在实体类中实现方法呢?
一个User
有一个Package
与它相关联.许多用户可以参考相同的包.User
没有Package
定义就不存在.User
应该拥有这种关系.关系是双向的,因此其中Package
包含零个或多个用户.
这些要求导致了Doctrine 2中的ManyToOne
关系User
和OneToMany
关系Package
.但是package_id
在user
表(即外键)中允许null
值.我试过设置nullable=false
但命令:
php app/console doctrine:generate:entities DL --path="src" --no-backup
Run Code Online (Sandbox Code Playgroud)
说这种nullable
关系没有属性ManyToOne
.我错过了什么?
class User
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
*/
private $package;
}
class Package
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="User", …
Run Code Online (Sandbox Code Playgroud) 我想从Auction表的id列中获取一组值.如果这是一个原始SQL我会写:
SELECT id FROM auction
Run Code Online (Sandbox Code Playgroud)
但是当我在Doctrine中执行此操作并执行:
$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
Run Code Online (Sandbox Code Playgroud)
我得到一个像这样的数组:
array(
array('id' => 1),
array('id' => 2),
)
Run Code Online (Sandbox Code Playgroud)
相反,我想得到这样的数组:
array(
1,
2
)
Run Code Online (Sandbox Code Playgroud)
我怎么能用Doctrine做到这一点?
我一直在阅读Doctrine的文档,但是我找不到一种方法来对findAll()结果进行排序.
我正在使用symfony2 + doctrine,这是我在Controller中使用的语句:
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll();
但我希望结果按升序用户名排序.
我一直试图以这种方式传递数组作为参数:
findAll( array('username' => 'ASC') );
但它不起作用(它也没有抱怨).
有没有办法在不构建DQL查询的情况下执行此操作?