2017-07-21 132 views
2

我想創建一個博客,我有兩個模型,Post和Tag。我想用透視表連接他們兩個。這是一種多對多的關係,我無法弄清楚如何將帖子和標籤鏈接在一起。當我嘗試這樣做時,它不會在我的數據庫上返回任何內容。帖子有標題和內容,而標籤只有名稱。 我讀過了,我必須使用同步方法或attach-detach,但我不知道該在哪裏做。它是在帖子路線或標籤路線?我已經通過利用包括職位和將它們分組在routes.php文件標籤的路線:2個模型與數據透視表,多對多的關係

Route::resource('/tags', 'TagController'); 

Route::resource('/posts', 'PostController'); 

這是我到目前爲止有:

我的Post模型:

class Post extends Model{ 
protected $fillable = [ 
    'title', 'content' 
]; 

protected $hidden = [ 
    'view_count' 
]; 

public function tags() 
{ 
    return $this->belongsToMany('App\Tag', 'post_tag'); 
}} 

這裏是我的標籤型號:

class Tag extends Model{ 
protected $fillable = [ 
    'name' 
]; 

public function posts(){ 
    return $this->belongsToMany('App\Post', 'post_tag'); 
}} 

這裏是我的post_tag透視表:

class CreatePostTagTable extends Migration{ 

public function up() 
{ 
    Schema::create('post_tag', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('post_id')->unsigned()->nullable()->index(); 
     $table->foreign('post_id')->references('id')->on('posts'); 
     $table->integer('tag_id')->unsigned()->nullable()->index(); 
     $table->foreign('tag_id')->references('id')->on('tags'); 
     $table->timestamps(); 
    }); 
} 

public function down() 
{ 
    Schema::dropIfExists('post_tag'); 
}} 
+0

代碼看起來不錯。你在嘗試什麼不起作用? –

+0

當我想創建一篇文章時,我希望唯一的用戶,即管理員,將他想要的任何標籤與他的帖子關聯起來。我應該使用sync方法創建什麼路徑來將帖子與標籤連接起來,因爲到目前爲止,我的帖子和我的標籤都是在創建時存儲的,但是沒有任何信息存儲在post_tag表中 – livia

+0

@joel hinz我現在意識到我的crud看起來不錯,但我有一個與你無關的問題。我可以編輯洞問題以問我如何在帖子的創建視圖中實現標籤複選框? – livia

回答

1

嘿,那裏我在拉拉維爾也是新人,我也有同樣的問題。在你的情況下,我認爲最好的做法是附加在你的PostController.php。讓我分享代碼爲你,我希望它能夠幫助

PostController中

public function store (Request $request) { 

    // First we need to create variable that contain your tag_id 
    // $tags = [1, 2, 4]; something like this 
    $tags = $request->input('tags'); 



    // Now storing the data in posts table 
    $post = new Post; 
    $post->title = $request->input('title'); 
    $post->content = $request->input('content'); 
    $post->save(); 

    //After save the post, we need to attach it 
    $post->tags()->attach($tags); 
} 

編輯:添加例如圖

<div> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="1"> 
 
    <label for="subscribeNews">Tag 1</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="2"> 
 
    <label for="subscribeNews">Tag 2</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="3"> 
 
    <label for="subscribeNews">Tag 3</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="n"> 
 
    <label for="subscribeNews">More tag</label> 
 
    </div>

然後在PostC ontroller.php你可以得到的ID,如果用戶選中複選框:

$tags = $request->input('tags'); 

EDIT2:添加例如使用同步

在這裏,我給你使用的同步小例子,首先讓我們設置一個職位它有5個標籤。而在最後,我們只是想設置3

$post = Post::find(1) //get the post with id 1, this post have 5 tags 
// Let's say that this post have 5 tags with this ids [1, 2, 3, 4, 5] 

// And then admin edit this post and select the tag with id [1, 2, 6] we set it in $tags variable 
$tags = $request->input('tags'); //[1, 2, 6] 

// And the last we just need to use sync method like this 
$post->tags()->sync($tags); 

// After use that, it will detach the tag based from removed ids [3, 4, 5] and attach new tag if there's new tag id [6] 
// And in the end the post just have 3 tags 

好吧即例如邏輯,我還是瞭解它,但我希望它可以幫助你:d

+0

你能告訴我一個例子使用同步() ? 這是事情。當管理員創建新帖子或對其進行編輯時,他可以爲帖子分配一個或多個標籤,無論他想要哪個標籤。他也有權創建新的標籤。如果創建的標籤自動同步不是更好嗎?這樣他可以刪除,創建新標籤並從列表中選擇一個或多個標籤。 p.s.我仍然沒有在我的帖子創建視圖中創建標籤的下拉列表 – livia

+0

啊看看我的編輯親愛的:D –

+0

謝謝@Arigi :) – livia

1

使用sync()功能,例如:

$post->tags()->sync($array_of_tags_ids) 
+0

是否有必要只包括數字爲ID?我不知道管理員將爲他的帖子選擇什麼標籤。有沒有另一種方法,而不是使用標籤ID創建數組? – livia

+0

@livia你有什麼想法?因爲要設置關係,只需使用透視表傳遞標記和帖子的ID –

+0

當管理員創建新帖子或對其進行編輯時,他可以爲帖子分配一個或多個標籤,無論他想要哪個標籤。他也有權創建新的標籤。從邏輯上講,如果我通過tag_id 1或3或其他什麼,我是不是強迫他只在1或3之間選擇? – livia

相關問題