CodeIgniter:datamapper ORM delete()一个关系;

时间:2011-06-24 05:56:07

标签: php codeigniter codeigniter-datamapper

我有一个名为用户国家/地区 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函数完成删除此类关系的最佳方法是什么?

2 个答案:

答案 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);