CakePHP 3.x — Связь и сохранение ассоциаций с 3 моделями через одну модель

Я использую CakePHP версии 3.x.

Мне нужно связать три модели (трекеры, статьи, Упоминания) через одну модель (TrackersArticlesMentions).

Вот определение моих отношений:

TrackersTable.php

    $this->belongsToMany('Mentions', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Articles', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);

ArticlesTable.php

    $this->belongsToMany('Mentions', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Trackers', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);

MentionsTable.php

    $this->belongsToMany('Articles', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Trackers', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);

TrackersArticlesMentionsTable.php

    $this->belongsTo('Trackers', [
'foreignKey' => 'tracker_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Articles', [
'foreignKey' => 'article_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Mentions', [
'foreignKey' => 'mention_id',
'joinType' => 'INNER'
]);

Пока что все работает отлично, когда я хочу найти свои данные и включить их (они также содержат).

К сожалению, когда я хочу ссылка на сайт я должен иметь возможность использовать функцию link и сделать что-то вроде этого:

$this->Trackers->link($trackerEntity, [$articleEntity, $mentionEntity]);

Но это не работает, функция ссылка на сайт ожидает в качестве второго параметра:

список лиц, принадлежащих к target сторона этой ассоциации

Возможно, я ошибаюсь, но, похоже, что функция создана для связывания только двух сущностей, второй параметр — только массив одной и той же сущности …

Я нашел решение, создав функцию в таблице TrackersArticlesMentionsTable следующим образом:

public function createLink(\App\Model\Entity\Tracker $trackerEntity, \App\Model\Entity\Article $articleEntity, \App\Model\Entity\Mention $mentionEntity)
{
return $this->findOrCreate([
'tracker_id' => $trackerEntity->get('id'),
'article_id' => $articleEntity->get('id'),
'mention_id' => $mentionEntity->get('id'),
]);
}

Но я бы хотел сделать это «правильно».
У кого-нибудь есть предложения?
Спасибо!

1

Решение

link() способ связывания одного объекта на стороне источника ассоциации с несколькими (обычно различными) объектами на стороне назначения ассоциации, например, связывания одного объекта Post на несколько Tagс, что будет сделано через Tags ассоциация.

Так что это означает, что через $this->Trackers->link() (Я предполагаю, что $this является табличным объектом, и, следовательно, $this->Trackers является объектом ассоциации), вы можете связать один Mention или же Article многократному Trackers.

Использование link() то, что вы имеете в виду, не поддерживается, поэтому вы должны пойти с чем-то вроде решения, которое вы придумали, например, создать и сохранить TrackersArticlesMention сущность по своему усмотрению — это прекрасно делать это.

1

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

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

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