Cake PHP 3:查找belongsToMany的查询 - 获取连接表中的实体相关

问题描述 投票:3回答:2

我有三个蛋糕PHP 3表: - ImagesTable - ImagesHasImagesTable - ImageTypesTable

One Image有很多ChildImages。我已经与belongsToMany协会联系在一起。

$this->belongsToMany('ChildImages',[
        'className' => 'Images',
        'targetForeignKey' => 'images_id',
        'foreignKey' => 'original_id',
        'joinTable' => 'images_has_images',
]);

现在我得到(几乎)期望的结果,其中包含所有相关图像的“child_images”数组这是查询:

$image = $imageTable->get($id,['contain' => ['ChildImages']]);

这是结果中的具体部分:

[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
        )
     )
)

我需要的是来自ImageTypes的相关实体,子图像数组中有[image_types_id] => 1。是否有可能在不迭代数组并为每个child_image执行一个查询的情况下达到该目标。

谢谢

php cakephp-3.0 jointable
2个回答
1
投票

(但)可能不包含连接表的关联,即使使用through选项提供具体的表类(您可能想要suggest that as an enhancement)也是如此。

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

class ImagesTable extends Table
{
    public function initialize(array $config)
    {
        // ...

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

并为ImagesHasImagesTable类:

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的额外关联,您可以包含以下数据:

['ImagesHasImages' => ['ChildImages', 'ImageTypes']]

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

也可以看看


0
投票

有可能使用“junction()

$imageTable->ChildImages->junction();

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

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

]);
© www.soinside.com 2019 - 2024. All rights reserved.