6

私はlaravelが初めてで、それを使ってフォトアルバムを作成しようとしています。私の問題は、アタッチ機能を使用してユーザー ID とグループ ID をデータベースに挿入することです。問題なく動作しますが、ドキュメントではアタッチ機能についてこう述べています

たとえば、ユーザーに割り当てたいロールがすでに存在している可能性があります。attach メソッドを使用するだけです。

だから私はそれを同じように使いたいと思っていました。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

アタッチ機能を誤解していると思います。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」にする必要があります。後で感謝します。

于 2013-03-22T19:34:28.047 に答える
2

Laravel コレクションのメソッドが含まれています

laravel コレクションは、非常に便利なメソッド「contains」を提供します。コレクションにキーが存在するかどうかを判断します。を使用して、ケースでコレクションを取得できます$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 に答える