CakePHP 3 Найти все Содержит данные NULL, ничего не отображает?

ОБНОВИТЬ

Это соединение из SQL после всех выборок,

FROM users Users 
LEFT JOIN userinfos Userinfos ON Userinfos.id = (Users.userinfo_id) 
INNER JOIN offices Offices ON Offices.id = (Userinfos.office_id)

хорошо, у меня есть база данных (MySQL), настроенная с CakePHP 3, таблица пользователей содержит расширенную информацию, хранящуюся в другой таблице.

Эта другая таблица также расширена информацией об офисе/адресе, однако по умолчанию для нее установлено значение NULL, поэтому я хочу включить ее в вызов «содержать», но не возвращать пользовательские данные, когда она пуста?

Так что это то, что я использую в настоящее время,

  $UsersTable->find('all')
             ->contain(['Userinfos','Userinfos.Offices'])
             ->toArray();

Но офисы (поле office_id в таблице Usersinfos) не всегда установлены, однако я все же хочу, чтобы он возвращал всех пользователей, даже если у них нет набора офисов.

Итак, я попытался,

  $UsersTable->find('all')
             ->contain([
                  'Userinfos',
                  'Userinfos.Offices'
              ])
             ->where(['Userinfos.office_id IS' => NULL])
             ->toArray();

Также,

  $UsersTable->find('all')
             ->contain([
                  'Userinfos',
                  'Userinfos.Offices' => 
                          function($q) {
                             return $q->where(['Userinfos.office_id IS' => NULL]);
                          }
              ])
            ->toArray();

Переменная $UsersTable установлена ​​на

   $UsersTable = TableRegistry::get('Users');

Если я удалю Userinfos.Offices из условия содержания, он вернет всех моих текущих пользователей. Однако как я могу вызвать эти дополнительные данные/информацию, чтобы иметь доступ к информации Office, например, название местоположения, если оно установлено?

*Возможно, я не совсем ясно объяснил, пожалуйста, дайте мне знать, если есть что-то, что я могу объяснить лучше, спасибо.


person user4458505    schedule 26.06.2015    source источник
comment
Вы проверили SQL, сгенерированный Cake?   -  person drmonkeyninja    schedule 26.06.2015
comment
Я сделал, но я не видел ничего плохого в этом, но я смотрю на это немного подробнее   -  person user4458505    schedule 26.06.2015
comment
Чего я не понимаю, так это того, что это работает, когда для 'office_id' установлено что-то? вот это я не могу понять   -  person user4458505    schedule 26.06.2015
comment
Какой тип соединения использует Cake для партнеров? Возможно, это нужно изменить для вашего требования.   -  person drmonkeyninja    schedule 26.06.2015
comment
Также не помешало бы, если бы вы показали сгенерированный SQL.   -  person ndm    schedule 26.06.2015
comment
обновил вопрос   -  person user4458505    schedule 26.06.2015
comment
Этого и следовало ожидать, INNER присоединение... как сказал @drmonkeyninja, проверьте свои ассоциации, по умолчанию это будет LEFT присоединение.   -  person ndm    schedule 26.06.2015
comment
Спасибо. Что я сделал, так это переместил офис в таблицу пользовательской информации от пользователей. Однако я скопировал «принадлежит» из того, что для меня испекла Cake. Мои знания SQL немного слабы, думаю, пришло время их расширить! - Пожалуйста, опубликуйте это как ответ, и я принимаю его.   -  person user4458505    schedule 26.06.2015


Ответы (3)


В cakePhp3.x по умолчанию, когда вы запекаете модель, для таблицы соединений устанавливается значение INNER JOIN. Вам нужно будет изменить ассоциации моделей. Вам нужно установить ассоциацию на LEFT JOIN.

В вашем случае, если вы посмотрите на «UserinfosTable» в src/model/UserinfosTable, убедитесь, что вы «LEFT JOIN» в таблице «User», или вы можете полностью удалить «joinType», потому что по умолчанию cakephp устанавливает Contain в «LEFT JOIN». '

class UserinfosTable extends Table
{

   public function initialize(array $config)
    {

      $this->belongsTo('Userinfos', [
            'foreignKey' => 'office_id',
            'joinType' => 'LEFT'
      ]);
   }
}
person Fury    schedule 12.11.2015

Попробуйте добавить предложение IS NULL в качестве значения вместо пары ключ/значение:

ex: $UsersTable->find('all')->where(['Userinfos.office_id IS NULL'])

person KEOKI    schedule 11.11.2015

Это правильный способ сделать NOT NULL (null - это просто isNull(

->where(function ($exp, $q) { return $exp->isNotNull('office_id'); });

person Chris Pierce    schedule 25.07.2017