Что-то я недогоняю есть ли возможность у 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, вобщем вопрос закрыт, проблема решена....
З.Ы. поговорил сам с собой