为 belongsToMany CakePHP 3 分页的条件

Posted

技术标签:

【中文标题】为 belongsToMany CakePHP 3 分页的条件【英文标题】:Conditions to paginate for belongsToMany CakePHP 3 【发布时间】:2015-06-26 13:27:40 【问题描述】:

我有 Semesters、Disciplines 表和一个联合表 Semesters_Disciplines。我想在 DisciplinesController 中创建一个操作索引,其中以 term_id 作为参数,该索引仅列出属于该学期的学科,并在参数中传递 id。我试过这个:

public function index($semester_id)

    $options = ['semester_id' => $semester_id];
    $this->paginate = ['conditions' => $options];

    $this->set('disciplines', $this->paginate($this->Disciplines));
    $this->set('_serialize', ['disciplines']);

【问题讨论】:

您的测试结果是什么,您预期或未预期会发生什么? Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'semesters_id' in 'where Clause' 嗯...'conditions' 只接受与控制器型号相关的条件。 .. 【参考方案1】:

您必须使用使用匹配或连接的查询才能过滤非 1:1/n-1 关联。

您可以通过将查询直接传递给paginate() 方法来做到这一点

// ...
$this->set('disciplines', $this->paginate(
    $this->Disciplines
        ->find()
        ->matching('Semesters', function(\Cake\ORM\Query $q) use ($semester_id) 
            return $q->where([
                'Semesters.id' => $semester_id
            ]);
        )
        ->group(['Disciplines.id'])
));
// ...

或使用自定义查找器。

// ...
$this->paginate = [
    'finder' => [
        'semesters' => [
            'semester_id' => $semester_id
        ]
    ]
];
$this->set('disciplines', $this->paginate($this->Disciplines));
// ...
// DisciplinesTable
public function findSemesters(\Cake\ORM\Query $query, array $options)

    $query
        ->matching('Semesters', function(\Cake\ORM\Query $q) use ($options) 
            return $q->where([
                'Semesters.id' => $options['semester_id']
            ]);
        )
        ->group(['Disciplines.id']);
    return $query;

另见

Cookbook > Pagination > Using Controller::paginate() Cookbook > Retrieving Data and Result Sets > Custom Finder Methods Cookbook > QueryBuilder > Filtering by Associated Data Cookbook > QueryBuilder > Adding Joins

【讨论】:

以上是关于为 belongsToMany CakePHP 3 分页的条件的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 保存 BelongsToMany 关联未知类型“”错误

在 CakePHP 3 中保存多个 belongsToMany 关联

CakePHP 3中关于belongsToMany关联的问题

如何在 CakePHP 3.x 中保存 belongsToMany 以进行编辑操作?

CakePHP:如何使用同一张表设置 BelongsToMany?

如何在 Cake 3.0 中保存 belongsToMany 数据?