6

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

例如,您希望附加给用户的角色可能已经存在。只需使用附加方法:

所以我想以同样的方式使用它,如果album_id已经存在就更新它,否则插入新的,但我的问题是它总是插入,它不检查是否album_id已经存在

我的模型

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
     }   

   }

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

4

3 回答 3

6

我相信您误解了附加功能。同步函数使用 attach 来添加关系,但前提是关系不存在。按照那里所做的事情,我建议拉一个 id 列表,然后仅在列表中不存在它的情况下插入。

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

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

于 2013-03-22T19:34:28.047 回答
2

包含 Laravel 集合的方法

laravel 集合提供了一个非常有用的方法“包含”。它确定集合中是否存在键。您可以使用$user->album. 您可以注意到专辑没有括号的区别。

工作代码

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

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

它是获得所需解决方案的更清洁和“Laravel”的方式。

于 2015-06-29T12:47:20.607 回答
1

谢谢@Collin 我注意到我误解了我昨天做了检查

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

        if(empty($album))
        {
           $user->album()->attach($album_id);
        }
于 2013-03-23T06:39:16.353 回答