cakephp 3.0 — Cake PHP 3: Найти запрос для ownToMany — получить сущность, связанную в таблице соединений

У меня есть три таблицы в торт PHP 3:
— ImagesTable
— ImagesHasImagesTable
— ImageTypesTable

Одно изображение имеет много ChildImages. Что я связал вместе с
принадлежит Ассоциации многих.

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

Что мне нужно, так это связанный Entity из ImageTypes с [image_types_id] => 1 внутри массива дочерних изображений. Есть ли возможность достичь этого без перебора массива и выполнения одного запроса для каждого child_image.

Спасибо

2

Решение

Невозможно (пока) содержать ассоциации для таблиц объединения, даже при использовании through возможность предоставить конкретный класс таблицы (вы можете предположить, что в качестве улучшения).

Что вы можете сделать, это создать дополнительную связь для таблицы соединений и использовать конкретный класс таблиц, который обеспечивает связь для 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']]

Конечно, возвращаемая структура будет немного другой, поэтому вам может потребоваться ее переформатировать.

Смотрите также

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]