【问题标题】:Cakephp 3 How to access deep contain associations in where clause?Cakephp 3 如何在 where 子句中访问深层包含关联?
【发布时间】:2016-11-10 21:48:15
【问题描述】:

我有一个关于 Cakephp 3.3 的问题,我不知道如何通过在 where 子句中使用 contains 来访问链接数据。

这是请求:

$cables = TableRegistry::get('cable_schedule');

    $cablemark = 'test1';
    $equipement = 'test2';
    $compartment = 'test3';
    $system = 'test4';

    $query = $cables->find('all')->contain(['CableType', 'Contract', 'EquipementSource' => ['Compartment', 'System'], 'EquipementDest' => ['Compartment', 'System']])
        ->where(['EquipementSource.Description like' => '%'.$equipement.'%'])
        ->orWhere(['EquipementDest.Description like' => '%'.$equipement.'%'])
        ->andWhere(['Cable_Mark like' => '%'.$cablemark.'%'])
        ->andWhere(['EquipementSource.Compartment.Description like' => '%'.$compartment.'%'])
        ->orWhere(['EquipementDest.Compartment.Description like' => '%'.$compartment.'%'])
        ->andWhere(['EquipementSource.System.Description like' => '%'.$system.'%'])
        ->orWhere(['EquipementDest.System.Description like' => '%'.$system.'%']);

    $this->set('cables', $query);

错误是:

SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列 'EquipementDest.System.Description'

【问题讨论】:

  • 这取决于模型之间的关系。如果所有关系都是 belongsTo 类型,那么您的查询是正确的。但我猜他们是 hasMany 或 belongsToMany。在这种情况下,您必须使用 match() 子句

标签: php cakephp cakephp-3.0


【解决方案1】:

您需要使用matching() 方法(参见CakePHP manual)。

例如,如果你有表格文章并且它有很多标签,你可以像这样过滤结果:

$query = $articles->find();
$query->matching('Tags', function ($q) {
    return $q->where(['Tags.name' => 'CakePHP']);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多