避免重复数据映射代码点火器中的数据库记录

时间:2012-05-01 07:17:37

标签: php codeigniter phpmyadmin codeigniter-datamapper

我的问题是如何将数据插入到连接表(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

但问题是当我在Books表中插入一本新书(像B3这样的Mike)时。副本将出现在books表中,上表将如下:

  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

现在我想要解决的是否有意义?或者我可能根本没有一本独特的书籍清单?

如果我要插入 鉴于数据库 用户和书籍 用户< --->书籍与users_books相关 我们需要确保当我们将书籍记录插入数据库时​​,它不是重复的。此外,如果书籍存在,则将插入关系而不是书籍记录。怎么能这样做? 一种方法是说

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

if(book->存在)在“books”表中     然后检查关系,看看用户和书籍之间是否存在关系,如果有,则不要插入。我还需要更改mysql db结构中的任何内容以避免这种情况。

上面的代码没有用,但应该知道我在说什么。

更新:

总之,如果两个用户喜欢同一本书,我只想将一个记录(书)插入到连接表(users_books)中,而不是在表中创建新记录。使用唯一的sql标记不起作用,因为它保留了唯一列表,但它阻止将多个关系插入到连接表users_books中。

1 个答案:

答案 0 :(得分: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