将图像标记保存到Laravel

时间:2017-01-13 21:04:39

标签: php mysql laravel

原谅我的新问题,这个问题主要是由于我对Laravel中多对多关系的顽固缺乏理解。

在我的网站上,用户可以上传图片

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

伴随着用户自己创建的标签。这些标记存储为数组,经过验证,然后检查标记是否存在。如果标签存在,我想在' tagmap'将新图像与该标记相关联。如果它不存在,我希望同样的事情发生,但也要创建一个新的标签。

我有3个表格,一个图像表格,一个标签表格和一个名为' tagmap'只有列' image_id'和' tag_id'。

保存图像后:

$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');
  } 
}

在我的Images模型中我有:

class Images extends Model {

  protected $table = 'images';

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

}

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

如果您有适当的命名约定,Laravel会自动执行数据透视表进程。

在这种情况下,您有imagestags,因此您的中间表应命名为image_tag

然后,如果要将标记与图像相关联,则可以使用sync()方法。如果您之前已关联过代码,则可以使用syncWithoutDetaching()

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

或者,如果您不想破坏现有关系,则可以使用syncWithoutDetaching()方法:

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