2017-01-13 5 views
2

私のnewb質問をお詫び申し上げます。この質問は主に、Laravelの多対多の関係についての私の頑固な不足が原因です。Laravelのピボットテーブルに画像タグを保存する

私のサイトで

、ユーザーは、ユーザーが自分で作成したタグを伴う画像

$images = new Images; 
... 
$images->save(); 

をアップロードすることができます。これらのタグは配列として格納され、検証され、タグが存在するかどうかがチェックされます。タグが存在する場合は、新しいイメージをそのタグに関連付けるエントリを 'tagmap'に追加します。それが存在しない場合、私は同じことが起こることを望むだけでなく、新しいタグを作成する必要があります。

私は、3つのテーブル、イメージテーブル、タグテーブル、および 'tag_id'というカラムを持つ 'tagmap'というピボットテーブルを持っています。だから、

画像が保存された後:私は悩みを抱えているところ

$tags = new Tag;   
foreach ($request->tags as $tags) { 
    if(preg_match('/^[a-zA-Z]+[a-zA-Z0-9._]+$/', $tags)) { 
     if (strlen($tags) < 21) { 
      if (Tag::where('tagname', $tags)->count() > 0) { 
       //store tag_id and image_id association on 'tagmap' table, no need to create new tag because tag exists 
      } else { 
       //create new tag on the 'tags' table 
       //store tag_id and image_id association on 'tagmap' table 
      } 
     } else { 
      return redirect()->back()->with('info', 'Tags may only contain 20 characters.');  
     } 
    } else { 
     return redirect()->back()->with('info', 'Tags may only contain letters and numbers, and must start with letters.'); 
    } 
}  
$tags->save(); 

コメントアウトセクションがあります。ここで

は私のタグのモデルである:私が持っている

class Tag extends Model { 
    protected $table = 'tags'; 

    protected $fillable = [ 
     'tagname', 
    ]; 

    public function Images() { 
     return $this->belongsToMany('CommendMe\Models\Images'); 
    } 
} 

と私のイメージでモデル:

class Images extends Model { 

    protected $table = 'images'; 

    public function tags() { 
     return $this->belongsToMany('CommendMe\Models\Tag'); 
    } 

} 

任意の助けをいただければ幸いです!

答えて

2

適切な命名規則がある場合、Laravelはピボットテーブルプロセスを自動化します。

この場合、imagestagsがあるため、中間テーブルの名前はimage_tagである必要があります。

タグを画像に関連付ける場合は、sync()メソッドを利用できます。以前に関連付けられたタグがある場合は、syncWithoutDetaching()を使用できます。

$image->tags()->syncWithoutDetaching(['array', 'of', 'tag', 'ids']); 
+0

奇数を:あなたは既存の関係を破壊したくない場合は

$image->tags()->sync(['array', 'of', 'tag', 'ids']); 

また、あなたはsyncWithoutDetaching()メソッドを使用することができます。なぜimage_tagsではなくimage_tagですか?また、なぜ$ images-> tags()の代わりに$ image-> tags()を使用するのですか?私はすでに$ images = new Imagesをしました。なぜそれが$画像になるのですか?ここで行われている構文は非常に混乱しています。 –

+0

@FelixMaxime Laravelは、テーブル名の関連付けプロセスを自動化します。モデル間の特異な名前を探します。この場合、単数形の画像は画像であり、単数形のタグはタグです。また、アルファベット順に表示されます。この場合、 'image_tag'が必要です。 – Ohgodwhy