Я использую 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'),
]);
}
Но я бы хотел сделать это «правильно».
У кого-нибудь есть предложения?
Спасибо!
link()
способ связывания одного объекта на стороне источника ассоциации с несколькими (обычно различными) объектами на стороне назначения ассоциации, например, связывания одного объекта Post
на несколько Tag
с, что будет сделано через Tags
ассоциация.
Так что это означает, что через $this->Trackers->link()
(Я предполагаю, что $this
является табличным объектом, и, следовательно, $this->Trackers
является объектом ассоциации), вы можете связать один Mention
или же Article
многократному Tracker
s.
Использование link()
то, что вы имеете в виду, не поддерживается, поэтому вы должны пойти с чем-то вроде решения, которое вы придумали, например, создать и сохранить TrackersArticlesMention
сущность по своему усмотрению — это прекрасно делать это.
Других решений пока нет …