Возможна ли ассоциация или нет на основе данных основной модели?

У меня есть таблица узлов (модель Node). Я бы хотел, чтобы он был связан с разными типами данных, но только в том случае, если для одного из его полей установлено значение 1.

Пример:

В моей таблице nodes есть поле data_article (tinyint 1). Я хочу, чтобы узел был $hasMany Article только в том случае, если это поле равно 1.

Я пробовал это:

public $hasMany = array(
    'Article' => array(
        'conditions' => array('Node.data_articles' => '1')
    ),
);

Но я получаю сообщение об ошибке:

Столбец не найден: 1054 Неизвестный столбец «Node.data_articles» в «предложении where»

Поскольку ассоциация выполняет поиск статьи в своем собственном запросе:

SELECT `Article`.`id`, `Article`.`title`, `Article`.`node_id`, ...more fields...
FROM `mydatabase`.`articles` AS `Article`
WHERE `Node`.`data_artiles` = '1'
AND `Article`.`node_id` = ('501991c2-ae30-404a-ae03-2ca44314735d')

Очевидно, что это не сработает, поскольку таблица Node вообще не подключается в этом запросе.

TLDR:

Возможно ли иметь ассоциации или нет на основе поля в основной модели? Если нет, то как еще я могу хранить разные типы данных в нескольких таблицах и не каждый раз запрашивать их все?


person Dave    schedule 11.08.2012    source источник


Ответы (2)


Я не думаю, что есть стандартный способ сделать это с CakePHP (по крайней мере, я не могу себе представить). Что определенно возможно, так это динамическое связывание связанных моделей.

Таким образом, вы можете запросить свою модель без ассоциаций, передав параметр recursive как -1 методу find() и основываясь на результате отвязать связанные модели динамически. После этого вам наверняка придется запрашивать снова. Вы можете построить из этого поведение, чтобы сделать его многоразовым.

Вполне элегантное решение было бы возможным, если бы Cake мог сделать двухшаговый запрос с обратный вызов после запроса основной модели, но до запроса связанных моделей, но в данный момент это невозможно.

Изменить: может быть не-Cake способ архивировать это более эффективно с помощью пользовательского запроса, включая IF-операторы, но я здесь не эксперт по SQL.

person bfncs    schedule 23.08.2012
comment
Это работает - спасибо. Вероятно, лучше выполнить быстрый запрос, если он уменьшает основной запрос на 1-4 соединения. - person Dave; 23.08.2012

Вы должны сделать это с другой стороны:

public $belongsTo = array(
'Node' => array(
    'conditions' => array('Node.data_articles' => '1')
  ),
);
person L. Sanna    schedule 11.08.2012
comment
Это не работает - ассоциации должны быть на модели, на которой вы делаете поиск. Если я выполню ассоциацию только таким образом, я не смогу получить дополнительные данные при выполнении Node-›find(). И это не поможет, если меня заставят делать запрос из фактических данных, так как я даже не буду знать, какие данные запрашивать. - person Dave; 11.08.2012