Cake: отношение habtm с ключом не по умолчанию на другой модели - PullRequest
1 голос
/ 22 сентября 2011

У меня есть 2 модели, которые должны быть связаны отношением habtm, имея такую ​​структуру таблицы:

КАТЕГОРИИ:

id   |   name   | ..
-----------------------
 1   |   test   | ..

ПОСТЫ:

id   |   name   | other_id | ..
---------------------------------
 1   |   test   | 5        | ..

CATEGORIES_POSTS:

id   |   category_id | other_id
--------------------------------
 1   |   1           |  5

Мне нужно получить сообщения со стороны категории, но, похоже, я не могу правильно установить отношение habtm.Важная вещь, о которой я до сих пор не упомянул, заключается в том, что идентификатор, используемый в Пост-модели, не id, а other_id.Это то, что я пробовал до сих пор (все в модели категорий):

  • установить для associationForeignKey значение 'other_id'

    в sql-запросе, который он имеет: CategoriesPost.other_id = Post.id фрагмент -> неправильное отношение (должно быть CategoriesPost.other_id = Post.other_id

  • установить для associationForeignKey значение false и добавить условие CategoriesPost.other_id = Post.other_id

    теперь фрагмент sql равен CategoriesPost. = Post.id -> sql error

  • установите для associationForeignKey значение CategoriesPost.other_id = Post.other_id

    . Это тоже ошибка, поскольку Cake принимает входные данные в виде 1 поля:CategoriesPost.other_id = Post.other_id = Post.id

Я знаю, что могу достичь отношения через 2 ссылки hasMany, но это дает мне много запросов вместо 1

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

просто измените модель поста primaryKey на лету для некоторых операций, которые вам нужны .... Для этого просто нужно сделать $ this-> primaryKey = 'other_id' ИЛИ ​​в контроллере $ this-> Post->primaryKey = 'other_id'

, который бы сработал.

Но помните, что если вы извлекаете данные из всех ассоциаций и у вас больше ассоциаций, чем у этой, то другие ассоциации, если они используют Post.id, потерпят неудачу, поскольку первичный ключ - Post.other_id

Вы должны сделать функцию поиска в своих пост-моделях, когда вы используете этот союз, что-то вроде этого:

function otherFind ($type, $options){
    $this->primaryKey = 'other_id';
    $result = $this->find($type, $options);
    $this->primaryKey = 'id';
    return $result;
}

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

Я настоятельно рекомендую использовать только ОДИН первичный ключ, поскольку второй не очень полезен.В любом случае первичный ключ должен быть уникальным, и вы можете связать что угодно только с одним.

1 голос
/ 24 сентября 2011

Cake не может настроить первичный ключ для использования в соединении при обычном поиске.

Вы можете использовать пользовательское объединение, если вы действительно хотите: http://book.cakephp.org/view/1047/Joining-tables

Почему именно вам нужны два идентификатора? Вы пытаетесь присоединить сообщение к категории, идентификаторы в любом случае будут уникальными; Что касается двух, основной должен работать просто отлично.

...