У меня есть две таблицы с полем username
в обеих. Как я могу указать имя поля как для локальной, так и для внешней таблицы?
Я хочу, чтобы CakePHP делал что-то вроде
ON (`T1`.`username` = `T2`.`username`)`
в результате. Без каких-либо изменений таблицы будут объединены со следующим условием:
ON (`T1`.`id` = `T2`.`t1_id`)`
Установки свойства 'foreign_key' = 'username'
недостаточно, потому что он будет создавать такой запрос:
ON (`t1`.`id` = `t2`.`username`)`
У меня есть два решения. Первый — использовать свойство «присоединиться» и присоединиться к таблице «на лету». В таком случае я могу установить как локальное, так и внешнее поле. Но если мне нужно присоединить больше таблиц к этой, объединенной вручную, я больше не могу использовать содержащуюся информацию, мне нужно написать следующие объединения вручную, даже если эти ассоциации были установлены правильно. Поэтому мне нужно каждый раз писать длинные определения соединения, вместо этого просто используйте 'contain' => array('T1', 'T2', 'T3')
Во-вторых, установить «primary_key» таблицы в соответствующее поле. Это можно сделать в файле модели или во время выполнения. В моем случае это невозможно сделать в модели, потому что эта таблица также имеет «правильную» ассоциацию по полю 'id'
. Настройте его во время выполнения, но мне это не нравится, потому что это неочевидно и выглядит как взлом.
Когда я задаю этот вопрос, я думал, что упускаю что-то очевидное, но теперь я понимаю, что CakePHP просто не может этого сделать. Поэтому я начал щедрость, надеясь, что кто-нибудь поделится решением. Если нет, я попытаюсь прочитать исходники торта и переопределить модель некоторых методов, чтобы добавить возможность определять локальное поле рядом с 'foreign_key'
в определении ассоциации.