Порядок манипулирования СОЕДИНЕНИЯМИ в CakePHP - PullRequest
4 голосов
/ 27 июля 2010

У меня следующая проблема с CakePHP:

В моей модели депозит принадлежит учетной записи, а учетная запись принадлежит клиенту.

При запросе депозитов я получаю информацию об учетной записи, но не информацию о клиенте по умолчанию.

Если я установлю для Deposit-> recursive значение 2, я получу информацию о клиенте (и многое другое), но CakePHP, по сути, выбрасывает один SELECT на каждый депозит, что довольно плохо в этом случае.

Итак, я сделал это:

'joins' => array(
    array('table'=>'customers', 'alias'=>'Customer', 'type'=>'left', 'foreignKey' => false, 'conditions'=>array('Account.customer_id = Customer.id'))
)

, который почти работает ...

Что я получаю от этого, по сути:

SELECT (...) FROM Deposits LEFT JOIN Customers LEFT JOIN Accounts

вместо

SELECT (...) FROM Deposits LEFT JOIN Accounts LEFT JOIN Customers

, что, конечно, не работает.

Можно ли вообще указать, что «мои пользовательские объединения» должны идти после «регулярных объединений моделей»?
Или мне нужно вручную отменить привязку депозита от учетной записи и указать оба соединения вручную?

Спасибо!
Даниэль

Ответы [ 4 ]

2 голосов
/ 16 августа 2010

Вам необходимо отменить привязку моделей, которые вы хотите быть наверху, и включить соответствующие массивы в массив 'joins'. Подробнее см. этот вопрос

2 голосов
/ 27 июля 2010

Вы можете использовать поведение Containable, чтобы выбрать именно то, что вам нужно, поэтому на контроллере Депозитов:

$this->Deposit->find('all', array(
    // conditions
    'contain' => array('Account' => array('Customer'))
));

Просто добавьте переменную actsAs в класс.Вот больше информации.http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

0 голосов
/ 20 апреля 2017

У меня тоже была такая ситуация, и я почти застрял тогда. После некоторого поиска я обнаружил, что есть 2 способа сделать это.

  1. Отредактируйте основной файл DboSource.php, чтобы изменить порядок соединений. ( Как изменить последовательность «соединений» в CakePHP? )

  2. Или нам нужно явно указать нашу связь в массиве $ joins. Затем используйте рекурсивный -1 в запросе.

Надеюсь, сейчас есть возможные варианты. Если у вас есть другие интересные способы, пожалуйста, пишите здесь!

0 голосов
/ 14 ноября 2012

Я понимаю, что это старый вопрос, но он все еще актуален ...

Cake просматривает существующие объединения перед добавлением новых, чтобы удовлетворить ассоциации.После некоторого копания в dbo_source.php (торт 1.3, также относится к 2.x) у меня есть то, что, указав ваши «объединения» точно, как их строит торт, вы можете эффективно изменить порядок объединений.

Итак,в вашем случае здесь:

'joins' => array(
array(
    'table' => '`accounts`', 
    'alias' => 'Account', 
    'type' => 'Left', 
    'conditions' => '`Deposit`.`account_id` = `Account`.`id`'
),
array(
    'table' => '`customers`', 
    'alias' => 'Customer', 
    'type' => 'Left', 
    'conditions' => '`Account`.`customer_id` = `Customer`.`id`'
)
)

Торт с использованием in_array () для этого, поэтому обратите внимание на `` вокруг таблицы и имен полей, заглавных букв LEFT и не используйте массив для условий, так как они необходимы для выполненияСравнительная работа.

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