标签: doctrine-orm

Doctrine中的默认值

如何在Doctrine 2中设置默认值?

php orm doctrine-orm

321
推荐指数
11
解决办法
28万
查看次数

Doctrine2:在参考表中使用额外列处理多对多的最佳方法

我想知道在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)

php orm doctrine model doctrine-orm

276
推荐指数
7
解决办法
10万
查看次数

在使用doctrine2删除级联时

我试图做一个简单的例子,以便学习如何从父表中删除一行,并使用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选项.我究竟做错了什么?

php cascading-deletes symfony doctrine-orm

218
推荐指数
2
解决办法
14万
查看次数

在Doctrine QueryBuilder中计算行数

我正在使用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进一步修改查询以进行分页.)

symfony doctrine-orm

190
推荐指数
8
解决办法
21万
查看次数

如何在Doctrine中使用findBy()来订购结果

findBy()在Doctrine存储库上使用该方法:

$entities = $repository->findBy(array('type'=> 'C12'));
Run Code Online (Sandbox Code Playgroud)

我该如何订购结果?

php doctrine-orm

137
推荐指数
3
解决办法
16万
查看次数

如何在Doctrine 2中使用WHERE IN

我有以下代码,它给我错误:

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)

php query-builder doctrine-orm

117
推荐指数
9
解决办法
17万
查看次数

Doctrine 2中的代理是什么?

我刚读完所有的Doctrine 2文档,我开始自己的沙盒,我理解了大部分的原理,但仍有一个问题,我在文档中找不到任何完整的解释.

  1. 什么是Proxy课程?
  2. 什么时候应该在实体上使用它们?

据我所知,代理类添加了一个层,让您可以向实体添加一些其他功能,但为什么要使用代理而不是在实体类中实现方法呢?

design-patterns proxy-classes doctrine-orm

111
推荐指数
2
解决办法
3万
查看次数

Doctrine 2在manyToOne关系中不能使用nullable = false吗?

一个User有一个Package与它相关联.许多用户可以参考相同的包.User没有Package定义就不存在.User应该拥有这种关系.关系是双向的,因此其中Package包含零个或多个用户.

这些要求导致了Doctrine 2中的ManyToOne关系UserOneToMany关系Package.但是package_iduser表(即外键)中允许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)

doctrine symfony doctrine-orm

108
推荐指数
1
解决办法
7万
查看次数

如何将一维标量数组作为doctrine dql查询结果?

我想从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做到这一点?

php doctrine-orm

104
推荐指数
6
解决办法
7万
查看次数

如何排序findAll Doctrine的方法

我一直在阅读Doctrine的文档,但是我找不到一种方法来对findAll()结果进行排序.

我正在使用symfony2 + doctrine,这是我在Controller中使用的语句:

$this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll();

但我希望结果按升序用户名排序.

我一直试图以这种方式传递数组作为参数:

findAll( array('username' => 'ASC') );

但它不起作用(它也没有抱怨).

有没有办法在不构建DQL查询的情况下执行此操作?

symfony doctrine-orm

101
推荐指数
8
解决办法
15万
查看次数