Laravel标记在数据库中创建双条目


laravel-tagging creates double entries in database

我正在尝试设置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_id设置为72,它从零开始计数,行为类似于自动增量。但它在数据库架构中没有自动增量设置。

这是我的设置方式:

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-taggingtag方法将标签放入数据库:

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

6(我再次保存该行

$article->save();

这给了我开头显示的双条目。为什么会这样?我做错了什么?我只是希望它使用原始条目来存储这些标签,而不是创建一个新标签。

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

EDIT2 我的Article模型如下所示:

namespace App;
use Conner'Tagging'Taggable;
use Illuminate'Database'Eloquent'Model;
class Article extends Model
{
    use Taggable;
    protected $table = 'tagging_tagged';
    public $timestamps = false;
}

看起来问题是因为您将Article模型上的 $table 属性设置为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() 时,扩展将为您处理。

我建议你用这种方法做拉拉维尔标记:首先创建新闻模型

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

这是你的网页

<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;