CodeIgniter: datamapper ORM delete () отношение; - PullRequest
2 голосов
/ 24 июня 2011

У меня есть таблицы с именами users , country и country_users .

Документация гласит, чтоудалите простое отношение, которое вы выполняете:

// Get user foo
$u = new User();
$u->where('username', 'foo')->get();

// Get country object for Australia
$c = new Country();
$c->where('name', 'Australia')->get();

// Delete relation between user foo and country Australia
$u->delete($c);

Это приведет к удалению соответствующей строки из таблицы country_users .

Мой вопрос: что, если у меня нет соответствующей страны() объект для построения?

Если между странами и пользователями существует отношение «один ко многим», то, безусловно, достаточно знать атрибут имени пользователя, чтобы отменить его связь со страной.

Кажется, что для всех функций удаления требуется как минимум двеобъекты ... Каков наилучший способ удаления отношения этого типа с использованием функций DataMapper ORM?

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Верьте или нет, я не смог удалить связь, используя код, предоставленный Уэсли.

Однако, похоже, это сработало:

$u = new User();
$u->where('id', $id)->include_related('country', 'id', TRUE, TRUE)->get();

$c = new Country();
$c->where('id', $u->country->id)->get();
$c->delete($u);
3 голосов
/ 24 июня 2011

"Кажется, что для всех функций удаления требуется как минимум два объекта"

Не совсем верно, delete() может быть предварительно сформирован для одного объекта без необходимости явного удаленияотношения объекта, он обрабатывается автоматически.

Из руководства пользователя :

Примечание : при удалении объекта все егоотношения с другими объектами также будут удалены.Бесплатная уборка дома!:)

Кроме того, вы можете использовать столбец в таблице пользователей для идентификатора страны вместо отдельной таблицы countries_users для отношений, предполагая, что это один (страна)-ко-многим(пользователи) отношения.

Мой вопрос: что, если у меня нет соответствующего объекта Country () для создания?

Тогда вам не о чем беспокоиться,Если нет взаимосвязей для удаления, попытка удалить их не принесет никакого вреда.

Существует связь для удаления!Я хочу передать user_id в мой контроллер и отсоединить его от страны в таблице стран_пользователей.Чтобы выполнить это, используя документированные функции, мне нужно было бы также указать country_id ... Какой ИМО не имеет отношения к этой операции.

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

Назначение новой страны (удаляет предыдущую)

$c = new Country();
// Get all countries named "Wonderland"
// Usually we'll use an id instead, there could theoretically be more than one
$c->where('name', 'Wonderland')->get(); 
$user->save($c);

Просто удалите все связанные страны (конечно, есть только одна)

$c = new Country();
// Get all countries
$c->get();
$user->delete($c); // You may need $c->all here

Если бы мы работали с отношениями "многие ко многим", вам, конечно, нужно было бы знать, какие из них следует удалить, но поскольку существует только один - достаточно удалить их все.

...