PHP / Symfony3 / Doctrine关联返回NULL

时间:2017-10-11 17:18:32

标签: php symfony doctrine-orm doctrine

我有2个表,一个是GrowerProjection,另一个是Crop。一种作物可以有许多与之相关的种植者预测。我使用已构建的基础数据库进入此项目,并且在数据库中,Crop具有唯一的ID,例如CROP-001,存储在名为crop_ID的列中。在GrowerProjection表中还有一个crop_ID字段,可以让您查看特定投影正在讨论的裁剪。

所以现在我使用Doctrine来生成实体,现在我正在尝试将这些实体绑定在一起。当我尝试创建一个ManyToOne关联时,我总是得到一个null值。我的问题是:1。我做错了什么2.以后如何调试这些问题?

我已经尝试通过控制台验证架构并更新架构,但这似乎没有效果。

以下是Growerprojection实体的相关剪辑:


/**
 * Growerprojection
 *
 * @ORM\Table(name="growerProjection")
 * @ORM\Entity
 */
class Growerprojection
{
    /** 
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Crop")
     * @ORM\JoinColumn(name="cropId", referencedColumnName="cropId")
     */
    private $crop;

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

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

    public function getReadyToLoadDt() {
        return $this->prjreadytoloaddt;
    }

    public function setReadyToLoadDt($theDate) {
        $this->prjreadytoloaddt=$theDate;
    }

    public function getCrop() {
        return $this->crop;
    }

}

我尝试使用join列作为crop_ID和cropId,因为doctrine使用cropId但实际的表使用crop_ID。我曾尝试使用和不使用@ID指令。没变。裁剪始终为空。

这是Crop实体部分:


/**
 * Crop
 *
 * @ORM\Table(name="crop")
 * @ORM\Entity
 */
class Crop
{
    /**
     * @var string
     *
     * @ORM\Column(name="commodity_ID", type="string", length=16, nullable=false)
     */
    private $commodityId;

    /**
     * @var string
     *
     * @ORM\Column(name="crop_ID", type="string", length=16)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $cropId;

    public function getCommodityID() {
        return $this->commodityId;
    }
}

然后,这是控制器的动作:


    public function testAction(Request $request)
    {
        $repository = $this->getDoctrine()->getRepository('AppBundle:Growerprojection');
        $projections = $repository->findBy(
            array('growerId' => 'GROW-001'),
            array('prjreadytoloaddt' => 'ASC')
            );
        $myCrop = $projections[0]->getCrop();
        \Doctrine\Common\Util\Debug::dump($myCrop);
        return $this->render('grower/growerTest.html.twig', 
            array('projections' => $projections));
    }

这会找到一个种植者投影,种植者投影将CROP-001作为cropId,并且裁剪表中有一个crop_ID为CROP-001的裁剪。

行\ Doctrine \ Common \ Util \ Debug :: dump($ myCrop);将始终产生NULL,当我在树枝内部执行dump()时,我也看到投影到达并填充,但列裁剪为空。

我在这里做错了什么,以及如何让这种关联发挥作用,以及如何在将来对此进行调试,以便我不必纠缠所有关于它的事情?

2 个答案:

答案 0 :(得分:0)

对于类的映射,name的{​​{1}}和referencedColumnName字段的值必须是sql表的实际列名,而不是字段名。请参阅Doctrine docs以供参考。

您的代码应如下所示

@ORM\JoinColumn

然而,我还没有找到一种调试这类错误的简单方法。对我来说最好的是,在建立协会时要非常小心。

答案 1 :(得分:0)

以下是发生的事情:

数据表没有内置的外键约束。我无法让它们工作,所以我开始了一个不同的项目,复制了几个Doctrine文件,并使用了Scorpion的建议表格#39的建议。然后我让Doctrine创建了模式,然后协会工作了。这里的计划是备份数据库中当前的数据,编辑所有的doctrine文件以建立关联,然后让doctrine正确地重新创建数据库并使用外键。