CakePHP 3.x - Link 并通过一个模型保存与 3 个模型的关联
CakePHP 3.x - Link and save associations with 3 models through one model
我正在使用 CakePHP 版本 3.x。
我需要link三个模型(追踪器、文章、提及) 通过一个模型 (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',
]);
追踪器文章MentionsTable.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 它们时,我应该能够使用函数 link 并执行如下操作:
$this->Trackers->link($trackerEntity, [$articleEntity, $mentionEntity]);
但是它不起作用,函数link期望作为第二个参数:
list of entities belonging to the target
side of this association
我可能错了,但是这个函数似乎是link只有两个实体,第二个参数只是同一个实体的数组...
我通过在 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'),
]);
}
但我愿意"properly"。
有人有什么建议吗?
谢谢!
link()
方法是对link单个关联源端实体,对多个(通常是不同的)关联目标端实体,例如link单个Post
到多个 Tag
s,这将通过 Tags
关联完成。
所以这意味着通过 $this->Trackers->link()
(我假设 $this
是一个 table 对象,因此 $this->Trackers
是一个关联对象),你可以 link 单个 Mention
或 Article
到多个(不同的)Tracker
s.
不支持您想到的 link()
的用法,因此您必须使用您提出的解决方案,例如创建并保存一个 TrackersArticlesMention
实体你自己的 - 这样做完全没问题。
我正在使用 CakePHP 版本 3.x。
我需要link三个模型(追踪器、文章、提及) 通过一个模型 (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',
]);
追踪器文章MentionsTable.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 它们时,我应该能够使用函数 link 并执行如下操作:
$this->Trackers->link($trackerEntity, [$articleEntity, $mentionEntity]);
但是它不起作用,函数link期望作为第二个参数:
list of entities belonging to the
target
side of this association
我可能错了,但是这个函数似乎是link只有两个实体,第二个参数只是同一个实体的数组...
我通过在 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'),
]);
}
但我愿意"properly"。 有人有什么建议吗? 谢谢!
link()
方法是对link单个关联源端实体,对多个(通常是不同的)关联目标端实体,例如link单个Post
到多个 Tag
s,这将通过 Tags
关联完成。
所以这意味着通过 $this->Trackers->link()
(我假设 $this
是一个 table 对象,因此 $this->Trackers
是一个关联对象),你可以 link 单个 Mention
或 Article
到多个(不同的)Tracker
s.
不支持您想到的 link()
的用法,因此您必须使用您提出的解决方案,例如创建并保存一个 TrackersArticlesMention
实体你自己的 - 这样做完全没问题。