CakePHP и подзапрос - PullRequest
       2

CakePHP и подзапрос

5 голосов
/ 24 апреля 2011

Как я могу написать подзапрос SQL, используя синтаксис торт? Я знаю, как кодировать простой запрос, но не могу обрабатывать подзапросы.

Это оригинальный запрос:

SELECT Assumption.id, Referee.id, Referee.first_name, Referee.second_name
FROM referees AS Referee
INNER JOIN (

    SELECT a.id, a.referee_id
    FROM assumptions a
    WHERE a.season_id =7
) AS Assumption ON Referee.id = Assumption.referee_id

Ответы [ 3 ]

6 голосов
/ 24 апреля 2011

Поскольку вы не поняли синтаксис, это фактический запрос:

$records = $this->Referee->find('all', array(
                'fields' => array(
                    'Assumption.id', 'Referee.id', 'Referee.first_name', 'Referee.second_name'
                    ),
                'joins' => array(
                    array(
                        'table' => 'assumptions',
                        'alias' => 'Assumption',
                        'type'  => 'INNER',
                        'foreignKey'    => false,
                        'conditions'    => array('Referee.id = Assumption.referee_id', 'Assumption.season_id = 7'),
                        ),
                ),
            )
        );

Который производит этот запрос:

SELECT 
    `Assumption`.`id`,
    `Referee`.`id`,
    `Referee`.`first_name`,
    `Referee`.`second_name`
FROM `referees` AS `Referee`
INNER JOIN assumptions AS `Assumption`
    ON (`Referee`.`id` = `Assumption`.`referee_id` 
        AND `Assumption`.`season_id` = 7)

Которые дают результаты, которые вы ищете.

Пример вывода:

Array
(
    [0] => Array
        (
            [Assumption] => Array
                (
                    [id] => 1
                    [0] => Array
                        (
                            [id] => 1
                            [season_id] => 7
                            [referee_id] => 1
                            [name] => SomeAssumpton
                        )

                )

            [Referee] => Array
                (
                    [id] => 1
                    [first_name] => Ref
                    [second_name] => one
                )

        )

)
2 голосов
/ 07 октября 2011

cdburgess ответ правильный для этой ситуации; это решает проблему самым простым и простым способом.

При этом при решении общего вопроса о выполнении подзапроса Поваренная книга документирует предпочтительное решение проблемы подзапроса . Это не очень элегантно, но так говорит гид, делая это.

Или вы можете просто быть очень осторожным и просто выполнить $ this-> Model-> query ().

1 голос
/ 27 июля 2011

после нескольких лет (нескольких часов) и чтения источника торта ... если вы хотите просто ввести свой подзапрос в условия торта ...

он использует php stdClass, а не запись массива... он просто поместит ваше "значение" в запрос ...

    $subquery = new stdClass();
    $subquery->type = "expression";
    $subquery->value = "Product.id IN (select product_id from product_categories where category_id='$category_id' or belongs_to='$category_id')";

    $options['conditions'][] = $subquery;  <- dump the class into your conditions array!

сделать обычный запрос $ this-> table-> find ('all', $ options)

ПРИМЕР: (нормальный торт с Quick-фиксом подзапроса)

    //only from my vendor
    $options['conditions']['collection_id'] = $vendor_id;

    //inner join to CollectionProduct
    $options['joins'][0] = array(
        "table" => "collection_products",
        "alias" => "CollectionProduct",
        "type"  => "INNER",
        "conditions" => array(
            "Product.id = CollectionProduct.product_id",
        ),
    );

    //show only from current category
    if ($category_id) {
        $subquery = new stdClass();
        $subquery->type = "expression";
        $subquery->value = "Product.id IN (select product_id from product_categories where category_id='$category_id' or belongs_to='$category_id')";
        $options['conditions'][] = $subquery;
    } else {
        //get 18 random items... no category selected?
        $options['limit'] = 18;
    }

    return $this->find('all', $options);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...