Получать поля из запроса тэга N: M 3 ​​[дублировать]

В решении упоминается - «Последнее, что нужно проверить, - убедиться, что вы не загружаете плагины перед загрузкой jQuery. Плагины расширяют объект« $ », поэтому, если вы загружаете плагин перед загрузкой ядра jQuery , то вы получите сообщение об ошибке.

Чтобы избежать этого -

Многие библиотеки JavaScript используют $ как имя функции или переменной, как это делает jQuery. В случае jQuery, $ является просто псевдонимом для jQuery, поэтому все функции доступны без использования $. Если нам нужно использовать другую библиотеку JavaScript вместе с jQuery, мы можем вернуть управление $ обратно в другую библиотеку с вызовом $ .noConflict ():

9
задан ndm 11 April 2016 в 13:06
поделиться

1 ответ

Использовать Query :: matching () или Query :: innerJoinWith ()

При запросе из таблицы 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 свойство.

18
ответ дан ndm 1 September 2018 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: