如何在此映射上获取驱动程序名称
Posted
技术标签:
【中文标题】如何在此映射上获取驱动程序名称【英文标题】:How do I get driver name on this mapping 【发布时间】:2014-08-23 11:47:13 【问题描述】:我使用many-to-one
映射并关联了这三个实体,我需要从模板中的关联中获取驱动程序名称,因此我在模板上执行此操作:
% for devices in pagination %
devices.getDriver.name
% endfor %
但我收到此错误:
对象“Device\DeviceBundle\Entity\Device”的方法“getDriver”确实 不存在于 /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 变量 ("") 中的属性 ("name") /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig 在第 49 行
为什么?
【问题讨论】:
【参考方案1】:你的 DeviceClass 没有 getDriver 方法,就像它写在异常中一样。 你必须实现一个驱动属性和一个getter/setter。
此外,您不需要实现 DriverHasDevice 类。 只需将您的 DeviceClass 的驱动程序属性映射到 DriverClass 的设备属性
它完全写在doku中,只需向下滚动或搜索“ManyToOne”。 http://symfony.com/doc/current/book/doctrine.htm
无论如何,只要你执行以下步骤,它就会起作用:
实现驱动属性 实现 getter/setter 将您的 xml 中的驱动程序设置为与 targetEntity 驱动程序一起归档的 ManyToOne看起来像这样:
<many-to-one field="driver"
target-entity="Driver"
inversed-by="devices"
>
不要伪造,如果您希望您的驱动程序知道其设备,您必须添加一个 ArrayCollection 作为属性并将其映射回设备。
【讨论】:
你能给我一些关于映射的帮助吗?我试了几次都没有成功:(【参考方案2】:首先你应该修改你的实体,包括driver
受保护的字段。
class Device
[...]
protected $driver
[...]
其次,您应该为该类属性实现 getter
和 setter
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 %
我没有验证您的映射文件,因此您可能必须正确修改它们...
【讨论】:
我按照您的建议进行了更改,但同样的错误仍然存在Impossible to access an attribute ("name") on a NULL variable ("") in /var/www/html/src/Device/DeviceBundle/Resources/views/List/listDevices.html.twig at line 49
值来自关系 driver_has_device
并且我需要从中获取驱动程序名称以上是关于如何在此映射上获取驱动程序名称的主要内容,如果未能解决你的问题,请参考以下文章