Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 14 ноя 2018, 02:12

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: ORM и left join
СообщениеДобавлено: 12 дек 2013, 12:53 
Не в сети
Зеленый

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM и left join
СообщениеДобавлено: 13 дек 2013, 21:32 
Не в сети
Бывалый
Аватара пользователя

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

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group