【问题标题】:Symfony3 - Doctrine associated object not populatingSymfony3 - 没有填充的教义相关对象
【发布时间】:2017-05-19 02:24:40
【问题描述】:

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

我有对象 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
  }

Market 类存在并且有相反的设置:

<?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 的新手。

【问题讨论】:

    标签: symfony doctrine symfony-3.2


    【解决方案1】:

    您在Vendor 中复制了market_id 列。您实际上不需要$marketId 字段。

    删除$marketId,只保留$market

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

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

    【讨论】:

      【解决方案2】:

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

      我在这里使用逆向工程方法来创建我的实体: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;
      

      现在与 vendor 相关的 ma​​rket 对象正在填充。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多