Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

ORM и left join
http://forum.kohanaframework.su/viewtopic.php?f=33&t=782
Страница 1 из 1

Автор:  Ke1eth [ 12 дек 2013, 12:53 ]
Заголовок сообщения:  ORM и left join

Что-то я недогоняю есть ли возможность у ORM достать связаные записи с left join и уточнением запроса в оном?
Просто занялся оптимизацией и сижу репу чешу:
вот примерный запрос
Код:
SELECT *
FROM `periods` AS `period`
LEFT JOIN `duties` ON ( `period`.`id` = `duties`.`period_id` )
AND `duties`.`date` = STR_TO_DATE( '12.12.2013', '%d.%m.%Y' )
AND `duties`.`user_id` = '5'
WHERE `period`.`deleted` =0
ORDER BY `period`


Раньше было просто: доставались все Period, и после чего, к оным в цикле доставались Duties.
Оказалось жирноватое кол-во запросов.

Т.е. такой вариант не дает желаемого результату, поскольку пропускает записи если у них нет связей во второй таблице:
Код:
ORM::factory('Period')->join('duties', 'LEFT')->on('duties.period_id', '=', 'period.id')
->where('duties.date', '=', DB::expr("STR_TO_DATE('".$day."', '%d.%m.%Y')"))
->and_where('duties.user_id', '=', $user->id)
->where('period.deleted', '=', 0)
->order_by('period')->find_all()


Т.е. есть-ли возможность указать у join(), что and должен быть у него?

Или я уперся в стену и в таком случае стоит забить на ORM?

UPD:
Решилось перетаскиванием в on:
Код:
ORM::factory('Period')->join('duties', 'LEFT')->on('duties.period_id', '=', 'period.id')
                ->on('duties.date', '=', DB::expr("STR_TO_DATE('".$day."', '%d.%m.%Y')"))
                ->on('duties.user_id', '=', DB::expr($user->id))
                ->where('period.deleted', '=', 0)
                ->order_by('period')->find_all()


А теперь смешной вопрос, duties нету ибо селект его и не тащит же :(

UPD:
Хорошо, изменение на:
Код:
ORM::factory('Period')
                ->select(array('b.id', 'duty_id'), array('b.date', 'date'), array('b.user_id', 'user_id'), array('b.working', 'working'))
                ->join(array('duties', 'b'), 'LEFT')->on('b.period_id', '=', 'period.id')
                ->on('b.date', '=', DB::expr("STR_TO_DATE('".$day."', '%d.%m.%Y')"))
                ->on('b.user_id', '=',DB::expr($user->id))
                ->where('period.deleted', '=', 0)
                ->order_by('period')->find_all()


помогло, но теперь чего-то другие связи отвалились и не хотят подтягиваться :(

UPD:
Правильный ответ: потому-то отлетел PK, у модели Duty, вобщем вопрос закрыт, проблема решена....

З.Ы. поговорил сам с собой :)

Автор:  WinterSilence [ 13 дек 2013, 21:32 ]
Заголовок сообщения:  Re: ORM и left join

Обсуждение схожей темы viewtopic.php?f=32&t=774
Я обычно в таких случаях добавляю в модель метод в котором вначале получаю данные из periods, а затем данные из duties на основе списка выбранных id'шников из запроса 1.

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/