php - CakePHP 3 连接表关联

标签 php cakephp orm cakephp-3.0

好吧,我对关联的工作方式有一些疑问,特别是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'

    ]);

}

表格/类别Table.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]);
}

它可以完成这项工作,但我还需要能够限制相关文章的数量..

最佳答案

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

$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);

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

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

关于php - CakePHP 3 连接表关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33028208/

相关文章:

phpmyadmin - 无法编辑 config.inc.php

validation - cakephp:将变量传递给自定义验证规则

php - 我可以在 CakePHP 的更新语句中添加条件吗?

php - 如何使用 Eloquent Query Builder 对与同一张表的关系使用 whereHas?

php - 使用 PHP Codeigniter 创建 Excel 文件

php - 如何自动更新网页的URI?

php - CakePHP3 在同一模型中将表链接在一起(内连接)

java - 当使用 Hibernate ORM 时,我应该先建模类图还是数据库图?

java - Hibernate 不承认持久的 getter/setter 属性

java - 没有容器的 Persistence.xml 文件使用 [packaging]