2

我有一个名为userscountriescountries_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);

这将从countries_users表中删除相应的行。

我的问题是,如果我没有要构造的相关 Country() 对象怎么办?

如果国家和用户是一对多的关系,那么肯定知道用户名属性就足以解除他与国家的关联。

所有删除函数似乎都需要至少两个对象......使用 DataMapper ORM 函数完成删除此类关系的最佳方法是什么?

4

2 回答 2

3

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

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

用户指南

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

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

我的问题是,如果我没有要构造的相关 Country() 对象怎么办?

那么你就不必担心任何事情了。如果没有要删除的关系,尝试删除它们不会造成任何伤害。

有关系要删除!我想将 user_id 传递给我的 Controller 并取消他与国家用户表中的国家/地区的关联。要使用记录的函数完成此操作,我还必须传入 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

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

于 2011-06-24T06:20:28.927 回答
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);
于 2011-06-24T07:41:16.627 回答