laravel-tagging在数据库中创建双重条目

时间:2016-05-16 12:14:47

标签: php mysql laravel

我正在尝试设置laravel-tagging系统并让它在数据库中存储标签。但是,每次我提交带有标签的文章时,它都会创建双重条目:

 id    taggable_id   taggable_type    tag_name    tag_slug
'72',    '128',      
'73',    '72',      'App\Article',   'Newtag1',  'newtag1'

第一个条目(id=72)具有正确的taggable_id,第二个条目(id=73)由laravel-tagging自动创建,并自动设置另一个taggable_id72,它从零起计数并且表现得像一个自动增量。但它在数据库模式中没有自动增量设置。

以下是我如何设置它:

1)我创建了一个新的模型实例:

$article = new Article;

2)然后我分配一个taggable_id,这是使用标签创建的帖子的ID:

$article->taggable_id = $postid;

3)我将$article保存到数据库中:

$article->save();

4)我在taggable_id找到数据库中保存的行并将其放入一个新的$article

$article = Article::where('taggable_id', $postid)->first();

5)我运行laravel-tagging的{​​{1}}方法将标记放入数据库:

tag

6)我再次保存该行

$article->tag($request->taggone);

这给了我开头所示的双重输入。为什么会这样?我究竟做错了什么?我只是想让它使用原始条目来存储这些标签,而不是创建一个新标签。

编辑:我试过跳过第4步,结果是一样的。

EDIT2 我的$article->save(); 模型如下所示:

Article

2 个答案:

答案 0 :(得分:2)

看起来问题是因为您将$table模型上的Article属性设置为tags表,它应保留在articles表中。

对此的一般想法是,laravel-tagging大部分内容都保持不变。唯一的区别是,如果您想要某个模型(例如Article)来支持标记,那么您需要做的就是将use Conner\Tagging\Taggable;语句添加到模型中。

然后你就像往常一样创作文章。例如

$article = new Article();
$article->title 'Test Article';
$article->body = 'Some article body';
$article->save();  // Should save it first before trying to tag

然后,如果您想在文章中添加标签

$article->tag('Gardening');  // This will tag this article

您不必担心在tagging_tagged表格上设置任何列,当您使用tag()时,扩展程序会为您处理。

答案 1 :(得分:1)

我建议您使用此方法进行laravel-tagging: 首先创建新闻模型

class News extends Model {
    public function tags()
    {
        return $this->hasMany('App\Tag', 'news');
    }  
}

然后创建标签模型

class Tag extends Model {
    public function getNews()
    {
        return $this->belongsTo('App\News', 'news');
    }
}

之后你应该创建一个控制器来插入带有标签的新闻。

public function postCreate(Request $request)
{
    //here you will insert your own datas
    $news = new News();
    $news -> description = $request->description;
    $news -> title = $request->title;
    $news -> save();

    foreach ($request->tags as $t)
    {
       $tags = new Tag();
       $tags->tag = $t;
       $tags->lang = $request->lang;
       $news->tags()->save($tags);
    }
}

这是你的HTML

<form>
   <input type="text" name="title"> <br>
   <input type="text" name="description"> <br>
   <input type="text" name="tags[]">
   <input type="submit">
</form>

这是你的sql数据

CREATE TABLE IF NOT EXISTS `news` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `description` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `title` (`title`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tag` varchar(255) NOT NULL DEFAULT '0',
  `news` int(11) NOT NULL DEFAULT '0',
  `lang` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `tag` (`tag`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;