symfony 2 Doctrine leftJoin NOT IN

时间:2015-08-12 13:19:46

标签: symfony join doctrine

我如何解决一个查询,我想从左表中获取右表中没有的所有数据?

左表:ID | NAME |日期 右表:ID | ID_left_table | NAME | DATE

由于我没有获得有关学说的经验,这让我感到困惑。

我的实体看起来像:

class NameData
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name",  type="string", length=255, nullable=false)
     */
    private $name;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;
.
.
.

class ValueData
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;


    /**
     * @ORM\ManyToOne(targetEntity="TestBundle\Entity\NameData")
     */
    private $nameid;

        /**
         * @var string
         *
         * @ORM\Column(name="name",  type="string", length=255, nullable=false)
         */
        private $name;

        /**
         * @var \DateTime
         *
         * @ORM\Column(name="date", type="datetime")
         */
        private $date;
    .
    .
    .

1 个答案:

答案 0 :(得分:0)

1)首先,将ValueData实体中的$ nameid属性注释修复为:

/**
 * @ORM\ManyToOne(targetEntity="NameData")
 * @ORM\JoinColumn(name="name_id", referencedColumnName="id")
 **/
private $nameData;

这是关系的基本Doctrine注释映射,在本例中为 ManyToOne

2)修改valueData表以添加外键,方法是输入 php app / console doctrine:schema:update --force migrations

3)让Symfony为您的ValueData实体生成正确的setter和getter,方法是在控制台中运行命令 php app / console doctrine:generate:entities TestBundle:ValueData

4)然后,如果你需要在控制器中获取数据:

$valueData = $this->getDoctrine()->getRepository('TestBundle:ValueData')->find(1);//Find by ID 1 OR ->findAll() to get all records
$nameData = $valueData->getNameData(); //This line of code behind the scenes will 
//join the valueData table with nameData, and get associated data

如果您在此过程中需要帮助,请添加评论。

修改

下面是查询构建器,用于选择所有没有任何ValueData的NameDatas:

$nameDataRepo = $this->getDoctrine()->getRepository('TestBundle:NameData');
$nameDatasWithoutDatavalues = $nameDataRepo->createQueryBuilder('nameData')
    ->leftJoin('nameData.dataValues', 'dataValue')
    ->where('dataValue.id IS NULL')
    ->getQuery()
    ->getResult

此外,请确保编写教义关系的双向部分,以便能够从父实体NameData.php访问子级:

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="ValueData", mappedBy="nameData")
 */
 private $valueDatas;

 /**
 * Constructor
 */
public function __construct()
{
    $this->valueDatas = new \Doctrine\Common\Collections\ArrayCollection();
}

在ValueData.php中,编辑$ nameData属性注释:

/**
 * @ORM\ManyToOne(targetEntity="NameData", inversedBy="valueDatas")
 * @ORM\JoinColumn(name="name_id", referencedColumnName="id")
 **/
 private $nameData;