2013-03-22 162 views
6

我是laravel的新手,并试图用它创建一个相册。 我的问题是,我使用的附加功能,插入用户ID和组ID到我的数据库,它的作品不错,但在文档中,它说这对附加功能Laravel雄辩多对多

例如,也许你的角色希望附加到已存在的用户 。只需使用附加方法:

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

我的模型

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

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

} 

邮功能

public function post_albums() 
    { 

     $user = User::find($this->id); 

     $album_id = Input::get('album'); 

     $path = 'addons/uploads/albums/'.$this->id.'/'. $album_id . '/'; 

     $folders = array('path' => $path, 'small' => $path. 'small/', 'medium' => $path. 'medium/', ); 

     if (! is_dir($path)) 
     { 
     foreach ($folders as $folder) 
     { 
      @mkdir($folder, 0, true); 
     } 
     } 


    $sizes = array( 
     array(50 , 50 , 'crop', $folders['small'], 90), 
     array(164 , 200 , 'crop', $folders['medium'], 90), 
    ); 

    $upload = Multup::open('photos', 'image|max:3000|mimes:jpg,gif,png', $path) 
      ->sizes($sizes) 
      ->upload(); 

    if($upload) 
    { 
     $user->album()->attach($album_id); 
     return Redirect::back(); 
    } 
    else 
    { 
     // error show message remove folder 
    } 

    } 

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

+0

顺便说一句:http://area51.stackexchange.com/proposals/46607/laravel – Kriem 2013-03-22 11:42:24

+0

你发布的链接怎么样? – 2013-03-22 12:20:31

+0

只是Laravel Stack Exchange提案的链接,对于那些对Laravel感兴趣的人。 – Kriem 2013-03-22 12:36:10

回答

1

感谢@Collin我发现我误会我做我这张支票昨天

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

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

我相信你误解了attach函数。 sync函数使用attach来添加关系,但前提是关系不存在。在那里做了什么之后,我建议拉出一个id列表,然后只在列表中不存在时插入。

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

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

2

Contains method of Laravel Collections

的laravel藏品提供了一个非常有用的方法 '包含'。它确定集合中是否存在密钥。您可以使用$user->album来获取您的案例中的藏品。你可以注意到这张专辑没有任何缺陷。

工作代码

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

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

其更清洁和'Laravel'获得所需解决方案的方式。

+0

这很方便,但是看起来很浪费,不得不从数据库中为用户提供所有相册的全部细节。您只想知道某个特定相册是否属于该用户。 – Jason 2016-04-12 11:52:36