2017-01-04 4 views
3

Спасибо, что прочитали. Я изучаю cakephp и имею несколько вопросов о Join in Cakephp. Я не могу найти подходящий ответ в ИнтернетеУ меня есть несколько вопросов о Присоединиться к Cakephp

1, В чем разница между innerjoin и innerjoinwith (например, leftjoin и leftjoinwith) Я думал, что это связано с проблемой исполнения, но не может найти никакой подсказки.

2, я не могу получить точную разницу между «совпадением» и «содержать» . Я знаю, как они извлекают данные, но я думал, что результат будет таким же, как результат совпадения и соответствия, используется innerjoin , и содержать с помощью leftjoin.

но но я не могу найти, в чем разница между приведенным ниже кодом (с использованием содержания) и сопоставлением.

$query = $articles->find()->contain([ 
'Comments' => function ($q) { 
return $q 
->select(['body', 'author_id']) 
->where(['Comments.approved' => true]); 
} 
]); 

3, что такое «_matchingData» в сопоставлении? Я прочитал это описание, то есть «Метод innerJoinWith() работает так же, как match(), это означает, что вы можете использовать точечную нотацию для объединения глубоко вложенных ассоциаций: опять же, единственная разница заключается в том, что дополнительные столбцы не будут добавлены к набору результатов, и никакое свойство _matchingData не будет установлено. "

, но я не нашел никакого описания о _matchingData. даже в API ... что это такое?

вы можете ответить один из них, все в порядке. пожалуйста, помогите мне

+0

Если включить [протоколирование запросов] (https://book.cakephp.org/ 3.0/ru/orm/database-basics.html # query-logging), вы можете попробовать разные комбинации запросов и изучить созданный ими SQL, что может дать вам некоторое представление о 1 и 2. И глядя на данные, возвращенные из запрос 'matching' должен дать вам четкое представление о том, что находится в' _matchingData'. Очень короткий ответ заключался бы в том, что если вы будете содержать отношения hasMany, записи будут загружены отдельным запросом, а 'matching' будет делать это с помощью соединения. –

+0

Грег Шмидт // Спасибо! Это полезно! – Jgj1018

ответ

2

1, В чем разница между innerjoin и innerjoinwith (например, leftjoin и leftjoinwith) Я думал, что это связано с проблемой исполнения, но не может найти никакой подсказки.

=> (1) здесь 'innerJoinWith' является вызываемым, который будет применяться право/внутреннее соединение (2) для левого присоединиться к 'leftJoinWith' является вызываемая

https://book.cakephp.org/3.0/en/orm/query-builder.html#using-innerjoinwith 

https://book.cakephp.org/3.0/en/orm/query-builder.html#using-leftjoinwith 

2, я не могу получить точную разницу между «сопоставлением» и «содержать» . Я знаю, как они извлекают данные, разные, но я думал, что результат выглядит так же, как результат ввода кода, здесь совпадение и совпадение - с использованием innerjoin, а содержать - использование leftjoin.

но но я не могу найти, в чем разница между приведенным ниже кодом (с использованием содержания) и сопоставлением.

$query = $articles->find()->contain([ 
'Comments' => function ($q) { 
return $q 
->select(['body', 'author_id']) 
->where(['Comments.approved' => true]); 
} 
]); 

=> Вкратце содержат применимые leftJoin и соответствующие применить правое/внутреннее соединение к запросу. , пожалуйста, прочитайте эту строчку по этой ссылке https://book.cakephp.org/3.0/en/orm/query-builder.html#using-innerjoinwith

3, что такое _matchingData? Я прочитал это описание, то есть «Метод innerJoinWith() работает так же, как и match(), это означает, что вы можете использовать точечную нотацию для объединения глубоко вложенных ассоциаций: опять же, единственное различие заключается в том, что никакие дополнительные столбцы не будут добавлены к набор результатов, и не будет установлено свойство _matchingData. "

, но я не нашел никакого описания о _matchingData. даже в API ... что это такое?

=>_matchingData() - свойство объекта, созданное при использовании метода сопоставления().Он содержит данные, выбирается соответствующий

$query = $articles->find(); 
$query = $query->matching('Comments', function($q){ 
      $q->select(['Comments.body', 'Comments.author_id']); 
      $q->where(['Comments.is_approved' => 1]); 
     return $q; 
}); 

Над запрос будет _matchingData собственность, содержащаяся в Comments.body, Comments.author_id

+0

Спасибо, что ответили на мои вопросы. Ты спас меня! Я просто хочу проверить, является ли «вызываемый», который вы прокомментировали на вопросе номер 1, аналогичен приведенной ниже ссылке. http://php.net/manual/en/language.types.callable.php Еще раз спасибо за ваш ответ! – Jgj1018

+1

Да вызываемые/обратные вызовы вы можете передать функцию в качестве аргумента – justrohu

+0

Спасибо !!!!!! – Jgj1018

Смежные вопросы