2012-05-01 11 views
0

私の質問は、メインテーブル(ブック)に重複したエントリを挿入することなく、データをジョインテーブル(user_book)に挿入する方法です。重複を避けるデータマッパーコードのイニシャライタのデータベースレコード

は、主に私たちは

id Users id Books id Users Books 
    1 Sam 1 B1  1 1 1 
    2 Ben 2 B2  2 1 3 
    3 Mike 3 B3  3 3 3 
         4 2 2 

下のツリーテーブルを持って検討してくださいしかし、私は本テーブルに存在し、新しいブック(B3などのEXマイク)を挿入していたときに問題があります。重複は、本表に表示され、上記の表は次のようになります:

id Users id Books id Users Books 
    1 Sam 1 B1  1 1 1 
    2 Ben 2 B2  2 1 3 
    3 Mike 3 B3  3 3 4 
      4 B3  4 2 2 

私が解決しようとしているものを今理にかなっていますか?それとも、私は書籍の一意のリストを持つことはできませんか?

私はデータベース ユーザーや書籍 ユーザー<考える を挿入しようと思った場合--->ブックは、我々は、DBへの本のレコードを挿入するとき、それがないことを確認する必要がありusers_books によって関連しています重複する。さらに、本が存在すれば、本の記録ではなく、関係が挿入される。それをどうすればできますか? 一つのアプローチは、テーブル その後、関係をチェックして、ユーザーや書籍の関係があるかどうかを確認(book->が存在する)場合は、「ブック」に

$m=new Book(); 
$m->where('id_book', $data['user_booklist'][$i]['id'])->get(); 
$u = new User(); 
$u -> where('id_user', $data['user_profile']['id'])-> get(); 
if(!$u->where_related($m)) 
{ 
$m -> name = $data['user_booklist'][$i]['name']; 
$m -> id_book = $data['user_booklist'][$i]['id'];            
$m -> save($u); 
} 

を言うことです、その後がある場合はしないでくださいそれを挿入します。さらに、これを避けるために、mysql db構造内のものを変更する必要があります。

上記のコードは機能していませんが、私が何を言っているのかを理解する必要があります。

更新:要するに

2人のユーザーが同じ本を好きなら、私は参加するテーブル(users_books)にしてテーブルに新しいレコードを作成しないようにしながら、レコード(書籍)を挿入します。ユニークなsqlタグを使用すると、ユニークなリストは保持されますが、複数のリレーションシップをジョインテーブルusers_booksに挿入することはできません。

あなたが行うことができ
+0

なぜ上記のコードは機能しませんか?行くべき正しい道に見えます。 – Zombaya

答えて

1

$b = new book(); 
$b->where('id_book', $data['user_booklist'][$i]['id'])->get(); 
// I believe you can do this as well, but I'm not sure: 
// $b->where('id', $data['user_booklist'][$i]['id'])->get(); 

$u = new user(); 
$u -> where('id_user', $data['user_profile']['id'])-> get(); 

if($b->exists() && $u->exists()) 
{ 
    // This saves the relationship between the book and the user 
    $b->save($u); 
} 
else 
{ 
    // Could not find the book or the user 
} 

あなたはdatamapper-manual on saving relationshipsをチェックアウトする必要があります。

関連する問題