我有一个名为用户,国家/地区和 countries_users 的表格。
documentation表示要删除您执行的简单关系:
// 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);
这会删除 countries_users 表中的相应行。
我的问题是,如果我没有构建相关的Country()对象怎么办?
如果国家和用户是一对多的关系,那么当然知道用户名属性足以让他与一个国家取消关联。
所有删除函数似乎都需要至少两个对象...使用DataMapper ORM函数完成删除此类关系的最佳方法是什么?
答案 0 :(得分:3)
“所有删除功能似乎至少需要两个对象”
并非完全正确,delete()
可以在单个对象上执行而无需显式删除对象的关系,它会自动处理。
来自user guide:
注意:删除对象时,与其他对象的所有关系也将被删除。免费清洁房子! :)
此外,您可以使用users表中的列作为国家/地区ID,而不是单独的countries_users
关系表,假设它是一个(国家/地区)对多个(用户)关系。< / p>
我的问题是,如果我没有相关的Country()对象来构建怎么办?
然后你不用担心任何事情。如果没有要删除的关系,尝试删除它们不会造成任何伤害。
有删除的关系!我想将user_id传递给我的Controller,并将他与countries_users表中的国家/地区取消关联。为了使用记录的函数实现这一点,我还必须传入country_id ...哪个IMO与此操作无关。
除非您特别想要删除特定关系,否则 无法查找国家/地区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
如果我们正在处理多对多的关系,你当然必须知道要删除哪些关系,但是因为只有一个 - 删除它们就足够了。
答案 1 :(得分:3)
信不信由你,我无法使用Wesley提供的代码删除关系。
但是,这似乎有效:
$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);