我正在使用CakePHP版本3.x。
我需要通过一个模型(跟踪器文章提及(链接三个模型(跟踪器,文章,提及(。
这是我的关系定义:
跟踪器表.php
$this->belongsToMany('Mentions', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Articles', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
文章表.php
$this->belongsToMany('Mentions', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Trackers', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
提及表.php
$this->belongsToMany('Articles', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
$this->belongsToMany('Trackers', [
'through' => 'TrackersArticlesMentions',
'saveStrategy' => 'append',
]);
跟踪器文章提及表.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'
]);
到目前为止,当我想找到我的数据并包含(又名包含(它们时,一切都运行良好。
不幸的是,当我想链接它们时,我应该能够使用函数链接并执行以下操作:
$this->Trackers->link($trackerEntity, [$articleEntity, $mentionEntity]);
但它不起作用,函数链接期望作为第二个参数:
属于该协会
target
方的实体名单
我可能是错的,但该函数似乎只链接两个实体,第二个参数只是同一实体的数组......
我通过在跟踪器文章提及表中创建一个函数找到了解决方案,如下所示:
public function createLink(AppModelEntityTracker $trackerEntity, AppModelEntityArticle $articleEntity, AppModelEntityMention $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
。
不支持您想到的link()
的使用,因此您必须使用您提出的解决方案之类的东西,例如自己创建和保存TrackersArticlesMention
实体 - 这样做完全没问题。