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 到多个 Tags,这将通过 Tags 关联完成。

所以这意味着通过 $this->Trackers->link()(我假设 $this 是一个 table 对象,因此 $this->Trackers 是一个关联对象),你可以 link 单个 Mention Article 到多个(不同的)Trackers.

不支持您想到的 link() 的用法,因此您必须使用您提出的解决方案,例如创建并保存一个 TrackersArticlesMention 实体你自己的 - 这样做完全没问题。