【问题标题】:CodeIgniter: datamapper ORM delete() a relation;CodeIgniter:datamapper ORM delete() 一个关系;
【发布时间】:2011-06-24 05:56:07
【问题描述】:

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

【问题讨论】:

  • no relevant Country()knowing the username attribute 是什么意思?
  • 1.我的意思是,我不一定知道这个国家——我也不需要知道这个国家来解除这种关系。 2.无论是username,还是user_id...都是唯一的key,用于标识join表中的一条记录。

标签: php codeigniter codeigniter-datamapper


【解决方案1】:

“所有删除功能似乎都需要至少两个对象”

不完全正确,delete() 可以在单个对象上执行,而无需显式删除对象的关系,它会自动处理。

来自user guide

注意:当您删除一个对象时,它与其他对象的所有关系也将被删除。免费打扫房间! :)

此外,您可以使用 users 表中的一列作为国家 ID,而不是使用单独的 countries_users 表作为关系,假设它是一个(国家)对多(用户)的关系。

我的问题是,如果我没有要构造的相关 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

如果我们处理的是多对多关系,您当然必须知道要删除哪些关系,但由于只有一个关系 - 将它们全部删除就足够了。

【讨论】:

  • 对不起,我应该更清楚一点,我意识到有一个 delete() 函数可以完全删除一个对象 + 它的所有关系。我考虑将 country_id 添加到 users 表中,但不确定这是否是最好的方法。关于“如果没有要删除的关系”……有要删除的关系!我想将 user_id 传递给我的 Controller 并将他与 countries_users 表中的国家/地区解除关联。要使用记录的函数完成此操作,我还必须传入 country_id... IMO 与此操作无关。
  • 我明白你的意思,当你说“没有相关的国家”时,我以为你的意思是你delete()正在处理这种关系,而不知道它是否存在。
  • 我现在很可能累得要死……你测试过你的解决方案了吗?当我的大脑不那么麻木时,我会再看看它。我发布的解决方案有点复杂,所以我期待一个更干净的解决方案。感谢您到目前为止的帮助:)
【解决方案2】:

信不信由你,我无法使用 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);

【讨论】:

  • 尝试这样做,除非您可以拥有多个相关国家/地区。多对多关系。自然,我似乎只能使用 include_related 访问“第一个”。 . . foreach 没有取得太大的成功。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2013-01-11
  • 2019-08-13
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多