2016-05-16 44 views
1

我試圖設置laravel-tagging系統並將其存儲到數據庫中。然而,它會創建兩個條目每次我提出與標籤的文章時間: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-taggingtag方法來獲取標籤到數據庫:

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

6)我保存的行再次

$article->save(); 

這使我在開始時顯示了雙重輸入。爲什麼會發生?我究竟做錯了什麼?我只是想讓它使用原始條目來存儲這些標籤,而不是創建一個新的標籤。

編輯:我試過跳過第4步,結果是一樣的。

EDIT2Article模式是這樣的:

namespace App; 

use Conner\Tagging\Taggable; 

use Illuminate\Database\Eloquent\Model; 

class Article extends Model 
{ 
    use Taggable; 

    protected $table = 'tagging_tagged'; 

    public $timestamps = false; 
} 
+0

爲什麼你需要步驟3和4?完整創建標記實例一次,然後將其保存到數據庫。 –

+0

@KaranPunamiya如果我不保存它,我會收到一個錯誤:「完整性約束違規:1048列'taggable_id'不能爲空'。我甚至創建了一個關於它的問題[這裏](http://stackoverflow.com/questions/37132856/integrity-constraint-violation-1048-column-taggable-id-cannot-be-null)以及我能得到的唯一方法圍繞它是在使用'tag'函數之前保存它。 –

+0

你能告訴我們你的'文章'模型嗎? – user3158900

回答

2

它看起來像這個問題是因爲你對你的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()

+0

我剛剛擁有了facepalms歷史上最大的facepalm。我花了三天的時間把頭靠在牆上尋找解決方案,這很簡單。你有我深深的鞠躬,謝謝! –

1

我建議你做這個方法laravel標記: 首先創建動態模型

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;