Соединение с запросом, извлекающим данные только из одной таблицы cakephp 3

Я новичок в cakephp. Я использую построитель запросов для получения сведений из двух таблиц, используя соединение в построителе запросов cakephp. Но запрос, который я пишу, извлекает данные только из одной таблицы. Нужна помощь, чтобы получить данные из другой таблицы.

Это мой код для получения данных путем объединения двух таблиц:

public function edit($id = null) {

    $events_table = TableRegistry::get('Events');

    $events = $events_table->find('all') 
            ->hydrate(false)
            ->join([
            'CourseType'=>  [
                        'table'      => 'coursetype',
                        'type'       => 'LEFT',
                        'conditions' => 'Events.type = CourseType.coursetype_id',
                    ]                   
            ])->where(['Events.id' => $id]);

     $event = $events->toArray();       
     $this->set('event', $event);
}

В результате я получаю только детали из таблицы событий. Но мне также нужны данные из типа курса. Любая помощь приветствуется. Спасибо.


person Varuni N R    schedule 28.07.2017    source источник
comment
попробуйте этот stackoverflow.com/a/845519/4514250. Может быть, это полезно.   -  person Parag Soni    schedule 28.07.2017
comment
Это для cakephp 3.x или cakephp 2.x?   -  person Varuni N R    schedule 28.07.2017


Ответы (2)


Добавление объединений вручную не приведет к выбору каких-либо дополнительных данных, вам придется сделать это самостоятельно, указав поля, которые будут выбраны с помощью метода select().

$events = $events_table
    ->find('all') 
    ->hydrate(false)
    ->select($events_table)
    // either add the fields one by one, or pass a table object
    // as above to select all fields of the table
    ->select(['CourseType.id', 'CourseType.xyz', /* ... */])
    // ...

Я бы предложил вместо этого использовать использование сдерживания, т.е. установить требуемую ассоциацию, если она еще не существует, а затем просто использовать contain():

$events = $events_table
    ->find('all') 
    ->hydrate(false)
    ->contain('CourseType')
    ->where(['Events.id' => $id]);

Смотрите также

person ndm    schedule 28.07.2017
comment
CourseType название модели? - person Varuni N R; 28.07.2017
comment
Это зависит от вашей настройки, я просто использовал те же псевдонимы, что и вы в своем примере. Если вы следуете именованию соглашениями CakePHP, тогда имя модели (класса таблицы) будет Coursetype, и если вы также будете следовать соглашениям для имен таблиц базы данных, то это будет course_types, а имя модели будет CourseTypes. @VaruniNR - person ndm; 28.07.2017
comment
Хорошо, спасибо. попробую - person Varuni N R; 28.07.2017
comment
С контейнером я могу использовать соединение? - person Varuni N R; 28.07.2017
comment
Нет, вы используете contain() вместо join(). @VaruniNR - person ndm; 28.07.2017
comment
Ваш ответ был полезен. Я получил ответ. Большое спасибо. Хотя я не экспериментировал с содержанием, я получил его с помощью select(). - person Varuni N R; 28.07.2017

ваше решение здесь: метод поиска CakePHP с JOIN

person Pratik Soni    schedule 28.07.2017
comment
Я думаю, что это для cakephp 2.x. Можете ли вы отправить ответ для cakephp 3.x? - person Varuni N R; 28.07.2017