Как CakePHP обрабатывает таблицы HABTM с / без поля 'id'? - PullRequest
3 голосов
/ 25 марта 2009

Как CakePHP работает с таблицами, в которых нет столбца id?

HABTM - это таблица «имеет и принадлежит многим», что означает отношение базы данных ко многим

Я пытаюсь сохранить некоторые данные об отношениях, но Cake хочет «SELECT LAST_INSERT_ID ()», однако в таблице, в которую он пытается сохранить, нет столбца id, поэтому идентификатор предназначен для другой таблицы. *

В частности, у меня есть таблицы для «Игр» и «Игроков» и таблица отношений, называемая «game_players». game_players имеет поля game_id и player_id, и именно на этой таблице я не могу сохранить данные отношений.

Чтобы уточнить: проблема заключается в таблице game_player. Эта таблица не имеет и не должна иметь поля id. Он хранит только отношения между игроком и игрой, и первичный ключ (game_id, player_id)

Как CakePHP справляется с этой ситуацией / отношениями?

Ответы [ 6 ]

8 голосов
/ 10 августа 2010

var $primaryKey = 'example_id'; $ primaryKey - это то, что вы ищете.

Просто поместите это в свой класс модели.

5 голосов
/ 25 марта 2009

Есть ли в игре HABTM Player или наоборот? Если это так, у вас не должно быть поля идентификатора на вашем игровом столе games_players. И вы сможете сохранить данные в нем, вызвав save в Game с массивом данных, подобным

$this->Game->save(array(
  'Player'=>array(
    'Player'=>array(
      1,4,5,9 // Player IDs
    )
  )
));

В этом случае Cake не будет пытаться получить последний идентификатор вставки.

Если, однако, Game не является HABTM Player, и вы вызываете команду save на вашей модели GamePlayer напрямую, она должна иметь поле идентификатора, чтобы соответствовать соглашениям Cake.

3 голосов
/ 25 марта 2009

CakePHP не поддерживает составные первичные ключи. Добавьте первичный ключ id в таблицу game_players. Model-и-База-конвенции

1 голос
/ 25 марта 2009

В обычном порядке ваша таблица соединений на самом деле должна называться games_players , а не game_players - если таблица называется game_players, вам нужно указать Cake это в вашей соответствующей модели файлы.

Если это просто таблица соединений, то обычно ей не требуется поле id. Существуют обстоятельства, когда вы захотите добавить идентификатор (или другие поля) в таблицу соединений, но это не обязательно.

0 голосов
/ 25 марта 2009

Как уже упоминали другие, ваш стол должен называться games_players , и вы никогда не должны использовать его напрямую (торт заботится об этом автоматически). Вы должны установить свои отношения между моделями Game и Player и позволить пирогу позаботиться обо всем остальном.

0 голосов
/ 25 марта 2009

В качестве вашего времени и усилий, было бы лучше просто пойти дальше и добавить поле id? Вы можете в конечном итоге расширить потребности этой таблицы способами, которые вы не ожидали.

Просто предложение.

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