CakePHP 3 find() с проблемой обратного вызова beforeFind() SQL

У меня проблема с целостностью данных при использовании find() в моем контроллере в сочетании с beforeFind() в обратном вызове поведения. WHERE Submissions.site_id не добавляется в предложение WHERE, как должно быть. Я получаю разные наборы результатов в зависимости от того, где установлено предложение WHERE.

в моем SubmissionsController:

public function index()
{

    $query = $this->Submissions->find('all')
                ->where(['user_id' => $this->Auth->user('id')])
                ->contain(['Users', 'Categories']);

    $this->set('submissions', $this->paginate($query));

}

В моем обратном вызове модели beforeFind() (прикрепленном как «TenantBehavior» к

$query->where([$this->_table->alias().'.'.'site_id' => 3]);

Проблема заключается в том, что с учетом вышеизложенного сгенерированный SQL помещает предложение «WHERE» как AND в условие JOIN, подобное этому, а НЕ в фактическое WHERE:

...
FROM 
submissions Submissions 
INNER JOIN users Users ON (
Users.id = (Submissions.user_id) 
AND Users.site_id = 3
) 
INNER JOIN categories Categories ON (
Categories.id = (Submissions.category_id) 
AND Categories.site_id = 3
) 
WHERE 
user_id = 315 

Если я удалю beforeFind() ->where и вместо этого размещу его на контроллере ->where, я получу ожидаемый SQL и набор результатов следующим образом:

...
FROM 
submissions Submissions 
INNER JOIN users Users ON (
Users.id = (Submissions.user_id) 
AND Users.site_id = 3
) 
INNER JOIN categories Categories ON (
Categories.id = (Submissions.category_id) 
AND Categories.site_id = 3
) 
WHERE 
(
user_id = 315 
AND Submissions.site_id = 3
) 

Мысли? Предложения?

РЕДАКТИРОВАТЬ По предложению @ndm я начал обновлять и предоставлять гораздо больше контекста. При этом я обнаружил (как идиот), что мне не хватает $this->addBehavior('Tenant'); в моей модели «SubmissionsTable». Добавление этого, конечно, решило проблему.


person wilsmex    schedule 10.05.2016    source источник
comment
Где именно (в каком классе) находится обратный вызов before find? Похоже, дело в поведении? Если это так, то где и как он загружается? И как выглядит остальная часть кода обратного вызова? Пожалуйста, всегда указывайте достаточно кода и информации, чтобы люди могли воспроизвести проблему! Также, пожалуйста, всегда указывайте свою точную версию CakePHP и соответствующим образом отмечайте свой вопрос!   -  person ndm    schedule 10.05.2016
comment
Ух ты. Спасибо. Я начал обновлять немного больше информации (я здесь новичок), и, как вы упомянули, когда я начал показывать, что действительно код beforFind() добавлялся в поведение моделей, когда я обнаружил, что на самом деле мне не удалось добавьте строку '$this-›addBehavior('Tenant')' в мою таблицу SubmissionsTable. Ваш запрос дополнительной информации помог мне осознать мою ошибку новичка. Большое спасибо, и урок усвоен!   -  person wilsmex    schedule 10.05.2016


Ответы (1)


$query = $this->Submissions->find('all', [
            'conditions' => [
                 'user_id' => $this->Auth->user('id')
             ],
             'contain' => [
                  'Users',
                  'Categories',
             ]
         ]);

Передача условий в виде встроенного массива решит вашу проблему и добавит beforeFind(), где условия правильно.

person Diomedes Andreou    schedule 10.05.2016
comment
Как это решит проблему, если будет эффективно создан тот же запрос, что и в гибком интерфейсе? Пожалуйста, всегда добавляйте хотя бы краткое объяснение при размещении примеров кода! - person ndm; 10.05.2016
comment
@diomedes, я пробовал это, но все еще вижу ту же проблему? - person wilsmex; 10.05.2016