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

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
  [...]

其次,您应该为该类属性实现 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 %

我没有验证您的映射文件,因此您可能必须正确修改它们...

【讨论】:

我按照您的建议进行了更改,但同样的错误仍然存​​在 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 并且我需要从中获取驱动程序名称

以上是关于如何在此映射上获取驱动程序名称的主要内容,如果未能解决你的问题,请参考以下文章

如何获取具有特定驱动器名称的驱动器的驱动器号? [关闭]

如何在 .NET 中获取计算机名称

我将如何获取可以在 android 上成为 Home 的应用程序的包名称

win10怎么看别人ip共享文件夹

C# winform映射端口问题

如何把SFTP映射成Windows驱动器