Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

FIND() или QUERY()

 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
mayar

цитировать



Зарегистрирован: 03 Апр 2009 15:52:14
Сообщения: 24

СообщениеДобавлено: 18 Авг 2009 08:53:13    Заголовок сообщения: FIND() или QUERY() Ответить с цитатой

Так уж повелось, что я использую в SQL-запросах "WHERE" вместо "JOIN". Это накладывает на мою работу с фреймворком некоторые неудобства.

А именно, я не знаю, как написать вот такой запрос:
SELECT j.id, jc.comment FROM jobs j, sites s, job_comments jc WHERE s.id = j.site_id AND j.id = jc.job_id AND s.site = '3333' AND jc.trouble = 1 с помощью "JOIN"

И тем более, у меня не получается написать правильный FIND. Ни conditions + contain, ни что другое не помогло.

Вот и приходится использовать $this->Model->query($query), а ведь хочется использовать методы фреймворка по-максимуму.

Есть ли какой-либо выйгрыш в производительности между find() и query()?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mayar

цитировать



Зарегистрирован: 03 Апр 2009 15:52:14
Сообщения: 24

СообщениеДобавлено: 19 Авг 2009 09:08:46    Заголовок сообщения: Ответить с цитатой

Возможно я не очень понятно объяснил суть проблемы:

Мне это нужно с
помощью FIND описать. В этом-то и был смысл темы.
В запросе FIND мы ведь можем обратиться только к 1 модельке:

Код:
$this->Site->Job->find('all', array(
                                'recursive'     => 2,
                                'conditions'    => array('Job.site_id' => 3),
                                'contain'        => array(
                                            'JobComment' => array(
                                                      'conditions' => array(
                                                              'JobComment.trouble'=>1)))))


Как через FIND указать "WHERE Site.site = '3333' AND
JobComment.trouble = 1" ?

У меня получается через FIND только вот такой запрос составлять:

Код:

SELECT * FROM `jobs` AS `j`
   INNER JOIN `sites` AS `s`
         ON (`s`.`id` = `j`.`site_id` AND  `j`.`site_id` = 3)
   LEFT JOIN `job_comments` AS `jc`
         ON (`jc`.`job_id` = `j`.`id` AND `jc`.`trouble` = 1);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
michas

цитировать



Зарегистрирован: 28 Янв 2008 11:28:31
Сообщения: 123

СообщениеДобавлено: 19 Авг 2009 22:07:34    Заголовок сообщения: Ответить с цитатой

Рекурсив в попу. Делайте все контейном[/code]
_________________
Все самое интересное в реальном времени - xmpp:cakephp@conference.jabber.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mayar

цитировать



Зарегистрирован: 03 Апр 2009 15:52:14
Сообщения: 24

СообщениеДобавлено: 20 Авг 2009 13:54:37    Заголовок сообщения: Ответить с цитатой

Ну вот третий день уже пытаюсь сделать и так и сяк и Set::extract, combine и т.д. И join'ы пробовал и т.п.

Ничего не выходит...

Получается тупой массив:

Код:

Array
(
    [0] => Array
        (
            [Job] => Array
                (
                    [id] => 10
                    [date] => 2009-08-13 00:00:00
                )

            [JobComment] => Array
                (
                    [comment] => tr1
                )

        )

    [1] => Array
        (
            [Job] => Array
                (
                    [id] => 10
                    [date] => 2009-08-13 00:00:00
                )

            [JobComment] => Array
                (
                    [comment] => tr2
                )

        )

    [2] => Array
        (
            [Job] => Array
                (
                    [id] => 3
                    [date] => 2009-08-17 00:00:00
                )

            [JobComment] => Array
                (
                    [comment] => tr3
                )

        )

)




А мне нужно:

Код:

Array
(
    [0] => Array
        (
            [Job] => Array
                (
                    [id] => 10
                    [date] => 2009-08-13 00:00:00
                )

            [JobComment] => Array
                (
                    [0] => Array (
                                            [comment] => tr1
                                       )
                    [1] => Array (
                                            [comment] => tr2
                                       )
                )

        )

    [1] => Array
        (
            [Job] => Array
                (
                    [id] => 3
                    [date] => 2009-08-17 00:00:00
                )

            [JobComment] => Array
                (
                    [0] => Array (
                                            [comment] => tr3
                                       )
                )

        )

)



Уже мозга за мозгу заезжает Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mayar

цитировать



Зарегистрирован: 03 Апр 2009 15:52:14
Сообщения: 24

СообщениеДобавлено: 20 Авг 2009 16:29:59    Заголовок сообщения: Ответить с цитатой

Вроде получилось.

Решение:

Код:
$data = $this->Site->Job->find(
                'all',
                array (
               'recursive'   => 1,
                    'fields'    => array('DISTINCT Job.date'),
                    'conditions' => array('Job.site_id' => 3),
                    'contain' => array (
                        'JobComment' => array(
                            'fields' => array (
                                 'JobComment.comment',
                                 'JobComment.created',
                                 'JobComment.whois'),
                            'conditions' => array ('JobComment.trouble' => 1) 
                             )
                       ),
               'joins' => array(
                    array(
                        'table' => 'job_comments',
                        'alias' => 'JobComment',
                        'type' => 'INNER',
                        'foreignKey' => false,
                        'conditions'=> array(
                        'JobComment.job_id = Job.id',
                            'JobComment.trouble = 1'
                        )
                    )
                 )
            ));
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sinoptik

цитировать



Зарегистрирован: 20 Авг 2009 16:29:34
Сообщения: 10

СообщениеДобавлено: 16 Сен 2009 16:49:29    Заголовок сообщения: Ответить с цитатой

'contain' Что это за деректива такая у меня она вообще не обробатывается.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mayar

цитировать



Зарегистрирован: 03 Апр 2009 15:52:14
Сообщения: 24

СообщениеДобавлено: 20 Сен 2009 17:01:43    Заголовок сообщения: Ответить с цитатой

Это behavior такой. Почитай: http://habrahabr.ru/blogs/php/38675/
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru