CakePHP 3 Find All Съдържа 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 по подразбиране, така че искам да я включа в повикване „contain“, но да не връщам потребителските данни, когато са празни?

Така че това е, което използвам в момента,

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

Но Offices (полето 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
Благодаря. Това, което направих, беше да преместя офиса в таблицата с потребителска информация от потребителите. Въпреки това копирах „belongsTo“ от това, което тортата беше изпекла за мен. Познанията ми по 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

Това е правилният начин да НЕ NULL (null е просто isNull(

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

person Chris Pierce    schedule 25.07.2017