Symfony3 - 没有填充的Doctrine关联对象

时间:2017-05-19 02:24:41

标签: symfony doctrine symfony-3.2

这是一个基本问题,我有一个我想要引用的关联对象,但它没有被实例化。不确定我做错了什么。

我有对象MARKET和VENDOR关联一对多。市场有很多供应商,供应商只有一个市场。我在加载供应商时希望得到市场对象。

class Vendor
{
    /**
     * @ORM\ManyToOne(targetEntity="Expedient\PurchaseBundle\Entity\Market", inversedBy="vendors")
     * @ORM\JoinColumn(name="market_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
     */

    private $market;

/**
 * @var int
 *
 * @ORM\Column(name="market_id", type="integer", nullable=true)
 */
private $marketId;

...

/**
 * Set market
 *
 * @param \Expedient\PurchaseBundle\Entity\Market $market
 *
 * @return Market
 */
public function setMarket(\Expedient\PurchaseBundle\Entity\Market $market = null)
{
    $this->market = $market;

    return $this;
}

/**
 * Get market
 *
 * @return \Expedient\PurchaseBundle\Entity\Market
 */
public function getMarket()
{
    return $this->market;
}

当我找到Vendor对象时,我发现没有市场设置。请注意,有一个marketId,但不包括市场对象。

  "vendor" => Vendor {#117 ▼
    -market: null
    -id: "11"
    -name: "A-Air Company"
    -account: ""
    -attn: "Rege Dumm / John Matthews"
    -address1: "206 Overlook Drive"
    -address2: ""
    -city: "Sewickley"
    -state: "PA"
    -zip: "15143"
    -country: "USA"
    -phone: "412-741-9420"
    -cellPhone: null
    -fax: "412-749-8590"
    -tag: "A-Air Company"
    -active: true
    -email: "rdumm@a-air.net; jmatthews@a-air.net"
    -securityAgreement: true
    -securityAgreementDate: DateTime {#114 ▶}
    -insuranceCert: true
    -insuranceCertDate: null
    -marketId: 1
  }

市场类存在且具有反向设置:

<?php

namespace Expedient\PurchaseBundle\Entity;

/**
 * Market
 */
class Market
{

    /**
     * @var integer
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Vendor", mappedBy="market")
     */
    protected $vendors;

    public function __construct()
    {
        $this->vendors = new ArrayCollection();
    }
}

不确定我可能在哪里出错。我是Symfony 3的新手。

2 个答案:

答案 0 :(得分:0)

market_id中有Vendor列重复。您实际上不需要$marketId字段。

删除$marketId并仅保留$market

当您想要访问市场ID时,您可以执行以下操作:

$vendor->getMarket()->getId();

答案 1 :(得分:0)

以下是我找到的解决方案,由于我创建实体的方式,这似乎是一个特定的案例。

我在这里使用逆向工程方法来创建我的实体:http://symfony.com/doc/current/doctrine/reverse_engineering.html

事实证明,这并没有正确设置关联实体,因为一些必要的注释没有自动添加到Market.php类中。

我不得不补充道:

 * @ORM\Table(name="market")**

并指定主键:

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

现在正在填充与供应商相关的市场对象。