2016-11-10 1 views
1

У меня проблема с Cakephp 3.3, в которой я не знаю, как получить доступ к связанным данным, используя предложение содержать в предложении where.Cakephp 3 Как получить доступ к глубокому содержанию ассоциаций в where clause?

Вот запрос:

$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]: Column не найдено: 1054 Неизвестный столбец 'EquipementDest.System.Description' в 'где предложение'

+0

это зависит от отношений, которые Вы имеете между вашими моделями. Если все отношения принадлежат типу, то ваш запрос правильный. Но я думаю, что они hasMany или принадлежит ToMany. В этом случае вам нужно использовать условие соответствия() – arilia

ответ

1

Вам необходимо использовать метод mathcing(). См CakePHP руководство http://book.cakephp.org/3.0/en/orm/query-builder.html#filtering-by-associated-data

Например, если у вас есть таблица статей и имеет много тегов, вы можете отфильтровать результаты, как это:

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