В решении упоминается - «Последнее, что нужно проверить, - убедиться, что вы не загружаете плагины перед загрузкой jQuery. Плагины расширяют объект« $ », поэтому, если вы загружаете плагин перед загрузкой ядра jQuery , то вы получите сообщение об ошибке.
Чтобы избежать этого -
Многие библиотеки JavaScript используют $ как имя функции или переменной, как это делает jQuery. В случае jQuery, $ является просто псевдонимом для jQuery, поэтому все функции доступны без использования $. Если нам нужно использовать другую библиотеку JavaScript вместе с jQuery, мы можем вернуть управление $ обратно в другую библиотеку с вызовом $ .noConflict ():
При запросе из таблицы Contacts
то, что вы ищете, это Query::matching()
или Query::innerJoinWith()
, not ( только) Query::contain()
.
См. Cookbook> Database Access & amp; ORM> Query Builder> Фильтрация связанными данными
Вот пример использования ваших таблиц:
$this->Contacts
->find()
->matching('Users', function(\Cake\ORM\Query $q) {
return $q->where(['Users.id' => 1]);
});
Это автоматически добавит необходимые условия соединения + к сгенерированному запросу .
Если вы вручную настроили много-много ассоциаций через hasMany
и belongsTo
, вы можете напрямую настроить таргетинг на таблицу соединений:
$this->Contacts
->find()
->matching('ContactsUsers', function(\Cake\ORM\Query $q) {
return $q->where(['ContactsUsers.user_id' => 1]);
});
Если вы действительно хотите, чтобы все ассоциации были возвращены в ваших результатах, просто продолжайте использовать contain()
слишком
$this->Contacts
->find()
->contain('Users')
->matching('Users', function(\Cake\ORM\Query $q) {
return $q->where(['Users.id' => 1]);
});
Это будет содержать всех пользователей, принадлежащих к контакту.
В случаях, когда у вас есть несколько совпадений, и вы хотели бы содержать только те совпадения, вам также пришлось бы фильтровать защитную оболочку. В этом примере это не имеет большого смысла, так как будет только одно совпадение, но в других ситуациях это может быть полезно, например, если вы хотели сопоставить все контакты с активными пользователями и получить контакты, включая все связанные с активными пользователями:
$this->Contacts
->find()
->contain(['Users' => function(\Cake\ORM\Query $q) {
return $q->where(['Users.active' => true]);
}])
->matching('Users', function(\Cake\ORM\Query $q) {
return $q->where(['Users.active' => true]);
});
Вы также можете нацеливать более глубокие ассоциации таким образом, используя синтаксис с обозначением точки с нотами, известный из Query::contain()
, например, если вы также имеет ассоциацию Users hasOne Xyz
, вы можете фильтровать Xyz.id
с помощью
->matching('Users.Xyz', function(\Cake\ORM\Query $q) {
return $q->where(['Xyz.id' => 1]);
})
. С этими ассоциациями и вашими простыми требованиями вы также можете легко запросить с другой стороны, то есть через таблицу Users
, и использовать только Query::contain()
для включения связанных контактов, например
$this->Users
->find()
->contain('Contacts')
->where([
'Users.id' => 1
])
->first();
. Все контакты могут быть найдены в сущностях contacts
свойство.