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()オブジェクトがない場合はどうなりますか?

国とユーザーが1対多の関係にある場合は、ユーザー名属性を知っていれば、国との関連付けを解除するのに十分です。

すべての削除関数には少なくとも2つのオブジェクトが必要なようです...DataMapperORM関数を使用してこのタイプの関係を削除するための最良の方法は何ですか?

4

2 に答える 2

3

「すべての削除機能には少なくとも2つのオブジェクトが必要なようです」

完全に真実ではありませんdelete()。オブジェクトの関係を明示的に削除しなくても、単一のオブジェクトでaを実行でき、自動的に処理されます。

ユーザーガイドから:

:オブジェクトを削除すると、他のオブジェクトとの関係もすべて削除されます。無料のハウスクリーニング!:)

さらに、countries_usersそれが1(国)から多(ユーザー)の関係であると仮定すると、関係の個別のテーブルの代わりに、国IDのユーザーテーブルの列を使用できます。

私の質問は、構築する関連するCountry()オブジェクトがない場合はどうなりますか?

そうすれば、何も心配する必要はありません。削除する関係がない場合、それらを削除しようとしても害はありません。

削除する関係があります!user_idをコントローラーに渡し、countries_usersテーブルで国との関連付けを解除したいと思います。文書化された関数を使用してこれを実現するには、country_idも渡す必要があります...この操作には関係のないIMOです。

特定の関係を特に削除する場合を除いて、国IDを検索する必要はありませんあなたの場合、ユーザーが1つの国しか持てない関係で作業しているため、削除する関連国を指定する必要はありません。これが私の頭の上の2つのオプションです:

新しい国の割り当て(前の国を削除)

$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);

関連する国をすべて削除するだけです(もちろん1つだけです)

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

多対多の関係で作業している場合は、もちろん、どれを削除するかを知っている必要がありますが、1つしかないため、すべてを削除するだけで十分です。

于 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 に答える