【问题标题】:PHP / Doctrine ORM multiple 'one-to-one' relations to the same classPHP / Doctrine ORM 对同一类的多个“一对一”关系
【发布时间】:2010-12-17 04:30:26
【问题描述】:

刚刚从事一个项目,我有一个名为“Product”的类和一个名为“Image”的类。每个产品有两种类型的图片,一种“正面”图片和一种“背面”图片,所以我定义了两个字段,一个叫 image_front_id,一个叫 image_back_id。

在 BaseProduct::setUp() 方法中,我定义了正面图像的关系如下:

$this->hasOne( 'Image', array ('local' => 'image_front_id', 'foreign' => 'id' ) );

现在,显然,当我为“Image”类定义另一个“hasOne”时,但现在使用“image_back_id”的本地字段名,这不能正常工作。所以我的问题是:如何定义同一个类的多个“一对一”关系?我一直在寻找这个,但我似乎找不到它。

【问题讨论】:

  • 我会考虑为不同类型的图像腾出更多空间,当您的设计发生变化并且您需要提供image_profile_id 时会发生什么,或者决定背面的图像永远不会获得任何视图,所以您可能会重构出来?很抱歉被OT,只是给你一个提示:)

标签: php doctrine database-relations


【解决方案1】:

正确的答案是

$this->hasOne('Image as FrontImage', array('local' => 'image_front_id', 'foreign' => 'id'));
$this->hasOne('Image as BackImage', array('local' => 'image_back_id', 'foreign' => 'id'));

【讨论】:

    【解决方案2】:

    如果您尝试关联 2 个不同的表,则 Zed 的答案有效,但听起来您正在尝试将两个字段与同一个表关联。 Arthur Frankel 的解决方案应该适合您。您不能有多个具有相同名称的关系,因此您必须使用别名来获得与同一个 Image 表的 2 个不同关系。通过声明“Image as FrontImage”和“Image as BackImage”,每个关系都有自己的别名。

    【讨论】:

      【解决方案3】:

      我认为解决方案如下(使用'as'关键字):

      $this->hasOne('Image as FrontImage', array('local' => 'image_front_id', 'foreign' => 'id', refClass => 'Image' ));
      $this->hasOne('Image as BackImage', array('local' => 'image_back_id', 'foreign' => 'id', refClass => 'Image' ));
      

      【讨论】:

        【解决方案4】:

        如果我没记错的话,第一个参数是引用的名称,引用的类是由 refClass 属性给出的:

        $this->hasOne('FrontImage', array('local' => 'image_front_id', 'foreign' => 'id', refClass => 'Image' ));
        $this->hasOne('BackImage', array('local' => 'image_back_id', 'foreign' => 'id', refClass => 'Image' ));
        

        【讨论】:

        • 您不需要refClass 进行常规的一对一关系
        • Doctrine 怎么知道 BackImage 关系指的是 Image 类呢?
        • 我认为那只是class
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多