Самый простой и быстрый способ получить эту работу - следовать правилу настройки CakePHP, а не настройке.
Это означает следовать соглашениям CakePHP, если только у вас нет веских причин не делать это.
Я настоятельно рекомендую начать с базовой настройки, которая, как вы знаете, работает, а затем изменить ее, если вам нужно.Вот быстрый и простой способ начать работу.
Таблицы базы данных
Начните с трех таблиц базы данных: пользователи, подписки и subscription_users.Схемы, которые у вас уже есть, в порядке, но я бы сделал пару изменений, чтобы все прошло гладко:
- Добавьте столбец
name
или title
в таблицу users
.Либо так, либо вам придется добавить свойство $displayField
к вашей модели пользователя.Если вы этого не сделаете, вы упустите некоторые из «автоматических», которые предоставляет CakePHP. Дополнительная информация о $ displayField - Измените имя объединяемой таблицы на
subscriptions_users
.Это соглашение CakePHP, и нет причин не экономить время и беспокоиться о его соблюдении.: -) - Используйте следующую схему для таблицы соединения:
CREATE TABLE subscriptions_users (
subscription_id int(11) NOT NULL,
user_id int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Обратите внимание, что ключи не определены.Из руководства CakePHP: «Чтобы избежать каких-либо проблем - не определяйте комбинированный первичный ключ для этих двух полей, если ваше приложение требует этого, вы можете определить уникальный индекс».
Модели
Постарайтесь сохранить ваш код в чистоте.В CakePHP реализовано много разумных настроек по умолчанию, и нет смысла определять их, когда они уже определены.
Следующие модели должны работать для вас:
user.php
<?php
class User extends AppModel {
var $hasAndBelongsToMany = array('Subscription');
}
?>
subscription.php
<?php
class User extends AppModel {
var $hasAndBelongsToMany = array('User');
}
?>
Довольно просто.Просто убедитесь, что файлы вашей модели имеют правильные имена: user.php и subscription.php, все строчные.
Также обратите внимание, что вам не нужно устанавливать какие-либо параметры отношений (className
, joinTable
и т. д.), если они не должны быть чем-то помимо значения по умолчанию.В девяносто процентах случаев значения по умолчанию должны служить вам просто отлично.
Вы должны быть в рабочем состоянии сейчас.Вы можете убедиться, что объекты модели загружаются и доступны в ваших контроллерах, например:
users_controller.php
<?php
class UsersController extends AppController {
var $name = 'Users';
function index() {
$this->autoRender = false;
var_dump(is_object($this->User));
var_dump(is_object($this->User->Subscription));
}
}
?>
subscription_controller.php
<?php
class SubscriptionsController extends AppController {
var $name = 'Subscriptions';
function index() {
$this->autoRender = false;
var_dump(is_object($this->Subscription));
var_dump(is_object($this->Subscription->User));
}
}
?>
Вывод / users и / subscription должен быть равен bool(true) bool(true)
.
Вы можете увидеть полные модели, выполнив pr($this->User);
.
Удаление записей
Если вы удалите одну запись, используя, например, $this->User->delete($user_id)
, все записи в таблице объединения с этим идентификатором пользователя также будут автоматически удалены.
Если вы хотите удалить отдельную запись из таблицы соединений HABTM, не удаляя записи, на которые она ссылается, по сути, «объединяя» две записи, вы можете сделать это с помощью модели SubscriptionUser.Это модель, которая создается на лету, когда есть отношение HABTM.
См. Пример для примера: CakePHP hasAndBelongsToMany (HABTM) Удалить запись присоединения