2017-05-09 50 views
0

我想創建en Eloquent模型而不立即保存到數據庫。然而,我想要包含所有關係,以便通過一次「push()」調用就可以保存整個結構。雄辯的關係 - 添加(但不保存)到belongsToMany

下面的例子顯示了我想要的。我建立了以下關係:

class Post extends Eloquent 
{ 
    public function tags() 
    { 
     return $this->belongsToMany('Tag'); 
    } 
} 

class Tag extends Eloquent 
{ 
    public function posts() 
    { 
     return $this->belongsToMany('Post'); 
    } 
} 

漂亮的標準,帖子可以有很多標籤,標籤可以屬於很多帖子。

我明白我可以簡單地做到這一點現在:

//save the post 
$post = new Post; 
$post->save(); 

//assign the tag 
$post->tags()->save($tag); 

不過,我真的在找的是:

//create the post 
$post = new Post; 

//assign the tag (without saving anything yet!) 
$post->tags()->add($tag); 

//save the whole thing 
$post->push(); 

相關的文檔是here但似乎沒有提及「添加」belongsToMany而不是「保存」。

任何幫助表示讚賞。

+0

我不認爲這是可能的。帖子和標籤的關聯方式是標籤具有post_id,如果我沒有弄錯,並且id僅在保存帖子時才生成,並且只有標籤才與帖子相關。 – Sandeep

+0

當然 - 實際上post_id和tag_id都會在post_tag表中,但要點。我仍然認爲這將是可能的。從實施的角度來看,我想它需要在樞軸之前簡單地創建父母。所以當然可能 - 但可能目前還沒有實施。 – Blueberry

+0

看起來,如果你有像這樣的數據透視表可能是可能的,你使用一些其他的標識符作爲外鍵,而不是使用生成的ID。隨着這一點,您可以先保存數據透視表,然後保存帖子和相關標籤。 – Sandeep

回答

1

這其實是很容易的,當你明白什麼

$post->tags()->add($tag); 

一樣。這將訪問標籤關係或查詢生成器,但是您只需在標籤中添加標籤。

Laravel沒有內置的方式來處理這一點,但你可以很容易地接近它,像這樣:

見下

$post->addTag($tag); // Adding a tag to our tag array 


protected $attributes = [ 
    'tags' => [],  
]; 

//type hint a tag and push the tag into our tags attribute 
public function addTag(Tag $tag) { 
    array_push($this->attributes['tags'], $tag); 
} 


//Iterate over the tags and attach them to our Post model, 
also save the post model after. 

public function push() { 
    return collect($this->attributes['tags'])->each(function($tag){ 
    $this->attach($tag); 
    }); 
    $this->save(); 
} 

我沒有測試的代碼,但希望這將得到你設置在正確的道路上。我也有興趣知道爲什麼你發現自己推動這個實施?我以前沒有找到像這樣的用例,並且可能能夠幫助您找到處理您的用例的更加標準化的方式。

+0

感謝您的回答。也許你是對的,這不是一個標準的方法。這個想法不僅要處理實現控制器時的基本CRUD方法,而且還要在內部將所有內容轉換爲標準模型。然後,這可以被保存,執行一些操作,扔掉,或者甚至可以直接在視圖上使用它,而不保存任何東西。如果我確實想要存儲,我可以簡單地將整個模型推送到數據庫。更標準的方法是什麼? – Blueberry

+0

我看到我看到了,所以在上面的示例中 - 您將傳遞預填充的未保留的Post對象。我傾向於堅持一切,或者在我的前端使用狀態持久性模式(請參閱vuex.vuejs.org),如果用戶想要「推送」,他們只需將Post對象從前端查找到API ,這與您在前端沒有框架的情況下類似的想法。也許你正處在一個你需要從你的網絡堆棧中獲得更多東西的地方?似乎使用Laravel的時候,在前端更容易維護時,這太過於誇張了。只是思考的食物 – ExohJosh

+0

實際上,帖子和標籤示例根本不在我的應用程序中。這只是爲了證明我正在努力做什麼。簡而言之,我認爲Eloquent模型不僅僅是一種持久存儲數據的方式,並且能夠在需要時輕鬆存儲。正如你在答案中所說的,我相信在模型的某些定製方面,它仍然是非常可能的,我只需要定製每個類來處理這些樞紐。但是你讓我考慮是否全部必要,所以謝謝你! – Blueberry