如何在此映射上获取驱动程序名称

时间:2014-07-02 15:34:15

标签: php symfony doctrine-orm

我使用many-to-one对这三个实体进行了映射和相关,我需要在模板中从关联中获取驱动程序名称,以便我在模板上执行此操作:

{% for devices in pagination %}
   {{ devices.getDriver.name }}
{% endfor %}

但是我收到了这个错误:

  

方法" getDriver" for object" Device \ DeviceBundle \ Entity \ Device"不   不存在于   /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig   在第47行

这是实体和地图信息:

Device.php

class Device
{

    protected $id;
    protected $description;
    protected $imei;
    protected $created;
    protected $modified;
    protected $deletedAt;

    public function getId()
    {
        return $this->id;
    }

    public function getDescription()
    {
        return $this->description;
    }

    public function setDescription($description)
    {
        $this->description = $description;
    }

    public function getImei()
    {
        return $this->imei;
    }

    public function setImei($imei)
    {
        $this->imei = $imei;
    }

}

设备映射

<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                        http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

    <entity name="Device\DeviceBundle\Entity\Device" table="device" repository-class="Device\DeviceBundle\Entity\Repository\DeviceRepository">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO" />
        </id>
        <field name="description" column="description" type="string" length="255" unique="true" nullable="false" />
        <field name="imei" column="imei" type="string" length="17" unique="true" nullable="false" />
        <field name="created" type="datetime">
            <gedmo:timestampable on="create"/>
        </field>
        <field name="modified" type="datetime">
            <gedmo:timestampable on="update"/>
        </field>
        <field name="deletedAt" type="datetime" nullable="true" />
        <gedmo:soft-deleteable field-name="deletedAt" time-aware="false" />
    </entity>
</doctrine-mapping>

DriverHasDevice.php(关系实体)

class DriverHasDevice
{

    protected $driver;
    protected $device;

    public function setDriver($driver)
    {
        $this->driver = $driver;
    }

    public function getDriver()
    {
        return $this->driver;
    }

    public function setDevice($device)
    {
        $this->device = $device;
    }

    public function getDevice()
    {
        return $this->device;
    }

}

DriverHasDevice的映射

<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                        http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

    <entity name="Device\DeviceBundle\Entity\DriverHasDevice" table="driver_has_device">
        <id name="driver" column="driver" association-key="true" />
        <id name="device" column="device" association-key="true" />

        <many-to-one field="driver" target-entity="Driver\DriverBundle\Entity\Driver">
            <join-column name="driver" referenced-column-name="id"/>
        </many-to-one>
        <many-to-one field="device" target-entity="Device\DeviceBundle\Entity\Device">
            <join-column name="device" referenced-column-name="id"/>
        </many-to-one>
    </entity>
</doctrine-mapping>

第三个实体不相关,所以我不显示代码,现在,我如何获得驱动程序名称?

添加方法

我将此方法添加到Device.php

public function getDriver()
{
    return $this->driver;
}

但现在错误是这个:

  

无法访问NULL变量(&#34;&#34;)中的属性(&#34; name&#34;)   /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig   在第49行

为什么?

2 个答案:

答案 0 :(得分:1)

您的DeviceClass没有getDriver方法,就像在异常中编写的一样。 您必须实现驱动程序属性和getter / setter。

此外,您不需要实现DriverHasDevice类。 只需将DeviceClass的驱动程序属性映射到DriverClass的devices属性

即可

它完全写在doku中,只需向下滚动或搜索&#34; ManyToOne&#34;。 http://symfony.com/doc/current/book/doctrine.htm

无论如何,如果您执行以下步骤,它将起作用:

  • 实现驱动程序属性
  • 实施getter / setter
  • 将xm中的驱动程序设置为使用targetEntity Driver
  • 提交的ManyToOne

它看起来像这样:

<many-to-one field="driver"
        target-entity="Driver"
        inversed-by="devices"
    >
如果你想让你的驱动程序知道它的设备,你必须添加一个ArrayCollection作为属性并将其映射回设备。

答案 1 :(得分:0)

首先,您应该修改您的实体,包括driver受保护字段。

class Device
{
  [...]
  protected $driver
  [...]
}

其次,您应该为该类属性

实现gettersetter
class Device
{
  [...]
  public function setDriver($driver) { 
    $this->driver = $driver;

    return $this;
  }

  public function getDriver($driver) {
    return $this->driver
  }
  [...]
}

第三,在twig中,你不应该试着直接调用方法:框架会为你做。

{% for devices in pagination %}
   {{ devices.driver.name }}
{% endfor %}

我没有验证您的映射文件,所以您可能需要正确修改它们......