首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Find Query for belongsToMany - get Entity in join table :查找join表中相关的实体

Find Query for belongsToMany - get Entity in join table :查找join表中相关的实体
EN

Stack Overflow用户
提问于 2017-02-02 00:33:36
回答 2查看 1.2K关注 0票数 3

我在蛋糕php 3中有三个表:

  • ImagesTable
  • ImagesHasImagesTable
  • ImageTypesTable

一个镜像有多个ChildImages。我已经和belongsToMany协会联系在一起了。

代码语言:javascript
复制
$this->belongsToMany('ChildImages',[
        'className' => 'Images',
        'targetForeignKey' => 'images_id',
        'foreignKey' => 'original_id',
        'joinTable' => 'images_has_images',
]);

现在我用一个包含所有相关图像的"child_images“数组得到了(几乎)想要的结果,这是查询:

代码语言:javascript
复制
$image = $imageTable->get($id,['contain' => ['ChildImages']]);

这是结果中的具体部分:

代码语言:javascript
复制
[child_images] => Array(
     [0] => Array(
        [id] => 36
        [image_size] => 269442
        [image_width] => 726
        ....
        [_joinData] => Array(
            [original_id] => 13
            [images_id] => 36
            [image_types_id] => 1
        )
     )
)

我需要的是子图像数组中包含image_types_id => 1的ImageTypes的相关实体。有没有可能在不迭代数组并为每个child_image执行一次查询的情况下实现这一点。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-02-02 03:58:44

现在还不能包含连接表的关联,即使在使用through选项来提供具体的表类时(您可能希望使用)。

您可以做的是为连接表创建一个额外的关联,并使用一个具体的表类来为ImageTypes提供一个关联,如下所示:

代码语言:javascript
复制
class ImagesTable extends Table
{
    public function initialize(array $config)
    {
        // ...

        $this->hasMany('ImagesHasImages',[
            'foreignKey' => 'original_id'
        ]);
    }
}

对于ImagesHasImagesTable类:

代码语言:javascript
复制
class ImagesHasImagesTable extends Table
{
    public function initialize(array $config)
    {
        // ...

        $this->belongsTo('Images', [
            'alias' => 'Images',
            'foreignKey' => 'original_id'
        ]);

        $this->belongsTo('ChildImages', [
            'alias' => 'Tags',
            'foreignKey' => 'image_id'
        ]);

        $this->belongsTo('ImageTypes');
    }
}

使用ImageTypes的额外关联,您可以包含如下数据:

代码语言:javascript
复制
['ImagesHasImages' => ['ChildImages', 'ImageTypes']]

返回的结构当然会稍有不同,因此您可能需要重新格式化它。

另请参阅

票数 1
EN

Stack Overflow用户

发布于 2019-03-10 11:47:52

可以使用"“

代码语言:javascript
复制
$imageTable->ChildImages->junction();

$image = $imageTable->get($id,

    ['contain' => 
      ['ImagesHasImagesTable',
       'ImagesHasImagesTable.ImageTypes', 
       'ImagesHasImagesTable.ChildImages'
      ]

]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41984884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档