CakePHP 3 连接表关联

Posted

技术标签:

【中文标题】CakePHP 3 连接表关联【英文标题】:CakePHP 3 join table associations 【发布时间】:2015-10-09 00:47:44 【问题描述】:

好的,我在理解关联的运作方式时遇到了一些问题,尤其是 belongsTo,这是我的设置:

文章可以有多个类别 类别可以属于多个文章

所以在我的数据库中我有 3 个表: articlescategories 和一个连接表 articles_categories

表格/ArticlesTable.php:

public function initialize(array $config)

    $this->addBehavior('Timestamp');
    $this->table('articles');
    $this->belongsTo('Users');
    $this->belongsToMany('Categories', [
        'through' => 'ArticlesCategories',
        'alias' => 'Categories',
        'foreignKey' => 'article_id',
        'joinTable' => 'articles_categories',
        'targetForeignKey' => 'category_id'

    ]);


表格/CategoriesTable.php:

public function initialize(array $config)

    $this->table('categories');
    $this->displayField('name');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
    $this->belongsToMany('Articles', [
        'through' => 'ArticlesCategories',
        'alias' => 'Articles',
        'foreignKey' => 'category_id',
        'joinTable' => 'articles_categories',
        'targetForeignKey' => 'article_id'
    ]);

表格/ArticlesCategoriesTable.php:

public function initialize(array $config)

    $this->belongsTo('Articles');
    $this->belongsTo('Categories');

现在在view 操作CategoriesController.php 中,我可以概述特定类别,我需要检索一些与该类别相关的文章。 什么是做这种事情的正确方法?这是我所拥有的:

public function view($id = null)

    $category = $this->Categories->find('all',['limit'=>1])->where(['Categories.id' => $id])->contain(['Articles']);
    $this->set(['category'=> $category]);

它有点工作,但我还需要能够限制相关文章的数量..

【问题讨论】:

“类别可以属于多个文章”为什么? 您可以拥有多个具有相同类别的文章 【参考方案1】:

您可以修改用于加载关联模型的查询对象:

$category = $this->Categories->find('all',['limit'=>1])
    ->where(['Categories.id' => $id])
    ->contain(['Articles' => function($q) 
        $q->limit(10);  
        return $q;
        
]);

编辑:或者你可以这样做

$category = $this->Categories->get($id, 
[
    'contain' => [
        'Articles' => function($q) 
            $q->limit(10);  
            return $q;
        
]);

或者,如果您想要没有类别数据的文章,您可以使用匹配

$articles = $this->Categories->Articles->find()
    ->matching('Categories', function ($q) use $id
        return $q->where(['id' => $id])
    ->limit(10);

我没有测试最后一个,但我认为类似的东西应该可以工作

但正如您所看到的,复杂性或多或少是一样的

【讨论】:

这行得通,但它真的是最简单的方法吗? 前两个达到相同的结果,最后一个也可以只获取文章。

以上是关于CakePHP 3 连接表关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 跨 2 个表保存关联数据

CakePHP 3.x - 保存这些表的关联数据和表单输入

cakephp 3.4 friendsofcake / csvview关联表问题

CakePHP 3 更新连接表中的数据

CakePHP 1.3 关联

Cakephp 3.x 保存 hasmany 关联