Laravel Eloquent多对多附加

时间:2013-03-22 07:20:36

标签: php mysql laravel

我是laravel的新手,并试图用它制作相册。 我的问题是我使用attach函数将用户ID和组ID插入到我的数据库中,它可以正常工作,但在文档中它说的是关于附加功能

  

例如,您可能希望将该角色附加到用户   存在。只需使用attach方法:

所以我想以同样的方式使用它,如果album_id已经存在只是更新它,其他明智的插入新的一个,但我的问题是它总是insters,它不检查是否{{1已经存在

我的模特

album_id

发布功能

class User extends Eloquent 
{
    public static $timestamps = false;

    public function album()
    {
        return $this->has_many_and_belongs_to('album', 'users_album');
    }

}

可以请某人指出我做错了什么?或者我完全误解了附加功能?

3 个答案:

答案 0 :(得分:6)

我相信你误解了附加功能。同步功能使用附加来添加关系,但前提是该关系尚不存在。按照那里所做的,我建议拉一个id列表,然后只插入列表中尚不存在的内容。

$current = $user->album()->lists( 'album_id' );
if ( !in_array( $album_id, $current ) )
{
    $user->album()->attach( $album_id );
}

在旁注中,我建议您遵循laravel的默认命名约定。关系方法应该是$ user-> albums(),因为它们中有很多。数据透视表也应命名为“album_user”。你以后会感谢自己。

答案 1 :(得分:2)

<强> Contains method of Laravel Collections

laravel集合提供了一种非常有用的方法'contains'。它确定集合中是否存在密钥。您可以使用$user->album在您的案例中获取该集合。你可以注意到专辑没有副作用的区别。

工作代码

现在你所要做的就是使用contains方法。完整的代码将是。

if (!$user->album->contains($album_id)
{
   $user->album()->attach($album_id);
}

它更清洁,更'Laravel'的方式来获得所需的解决方案。

答案 2 :(得分:1)

谢谢@Collin我注意到我误解了我昨天做了我的支票

$album = $user->album()->where_album_id($album_id)->get();

        if(empty($album))
        {
           $user->album()->attach($album_id);
        }