Cakephp beforeFind () - Как мне добавить условие JOIN, ПОСЛЕ добавления добавленной ассоциации - PullRequest
1 голос
/ 28 апреля 2010

Я нахожусь в Model-> beforeFind ($ queryData), пытаюсь добавить условие JOIN к queryData для модели, которая принадлежит ассоциациям. К сожалению, новый JOIN ссылается на таблицу в ассоциации ownTo, поэтому он должен появиться ПОСЛЕ ОТВЕТА в запросе.

Вот мой Tagged-> принадлежит к ассоциации:

app\plugins\tags\models\tagged.php (line 192)
Array
(
    [Tag] => Array
        (
            [className] => Tag
            [foreignKey] => tag_id
            [conditions] => 
            [fields] => 
            [order] => 
            [counterCache] => 
        )

    [Group] => Array
        (
            [className] => Group
            [foreignKey] => foreign_key
            [conditions] => Array
                (
                    [Tagged.model] => Group
                )

            [fields] => 
            [order] => 
            [counterCache] => 
        )

)

Вот JOIN, добавленный в Tagged-> beforeFind (), обратите внимание на то, что присоединения ownTo еще не были добавлены:

app\plugins\tags\models\tagged.php (line 194)
Array
(
    [conditions] => Array
        (
            [Tag.keyname] => europe
        )

    [fields] => Array
        (
            [0] => DISTINCT Group.*
            [1] => GroupPermission.*
        )

    [joins] => Array
        (
            [0] => Array
                (
                    [table] => permissions
                    [alias] => GroupPermission
                    [foreignKey] => 
                    [type] => INNER
                    [conditions] => Array
                        (
                            [GroupPermission.model] => Group
                            [0] => GroupPermission.foreignId = Group.id
                            [or] => Array
                                ( ... )
                        )

                )

        )

    [limit] => 
    [offset] => 
    [order] => Array
        (
            [0] => 
        )

    [page] => 1
    [group] => 
    [callbacks] => 1
    [by] => europe
    [model] => Group
)

Когда я проверяю вывод, он завершается с ошибкой «1054: неизвестный столбец« Group.id »в« предложении »», потому что соединение разрешений появилось ДО объединения групп.

    SELECT DISTINCT `Group`.*, `GroupPermission`.*
    FROM `tagged` AS `Tagged`
    INNER JOIN permissions AS `GroupPermission` ON (`GroupPermission`.`model` = 'Group' AND `GroupPermission`.`foreignId` = `Group`.`id` AND (...))
    LEFT JOIN `tags` AS `Tag` ON (`Tagged`.`tag_id` = `Tag`.`id`)
    LEFT JOIN `groups` AS `Group` ON (`Tagged`.`foreign_key` = `Group`.`id` AND `Tagged`.`model` = 'Group')
    WHERE `Tag`.`keyname` = 'europe'

Но этот SQL (с присоединенными разрешениями, перенесенными в конец) работает нормально:

    SELECT DISTINCT `Group`.*, `GroupPermission`.*
    FROM `tagged` AS `Tagged`
    LEFT JOIN `tags` AS `Tag` ON (`Tagged`.`tag_id` = `Tag`.`id`)
    LEFT JOIN `groups` AS `Group` ON (`Tagged`.`foreign_key` = `Group`.`id` AND `Tagged`.`model` = 'Group')
    INNER JOIN permissions AS `GroupPermission` ON (`GroupPermission`.`model` = 'Group' AND `GroupPermission`.`foreignId` = `Group`.`id` AND (...))
    WHERE `Tag`.`keyname` = 'europe'

Как мне добавить свое объединение в beforeFind () после присоединения к нему?

1 Ответ

0 голосов
/ 28 сентября 2011

Объединение не может ссылаться на что-либо в ассоциациях, так как ассоциации выбираются с помощью отдельных запросов. Если вам нужно добавить объединение, которое ссылается на ассоциацию, вам также необходимо вручную добавить ассоциацию в объединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...