2017-05-09 7 views
0

en Eloquentモデルをすぐにデータベースに保存せずに作成したいと思います。しかし、すべての関係を含めると、単一の "push()"呼び出しで構造全体を保存できるようになります。Eloquent relations - 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ですが、の言及がないようです"save"ではなく "belongsToMany"に "add"します。

助けてください。あなたは

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

が何をするのかを理解したときに

+0

私はそうは考えていません。投稿とタグは、間違っていなければタグにはpost_idがあり、投稿が保存されているときにのみidが生成され、投稿に関連するタグが付くように関連付けられます。 – Sandeep

+0

確かに - 実際にはpost_idとtag_idの両方がpost_tagテーブルにありますが、ポイントが取られます。私はまだこれが可能であると考えていたでしょう。実装の観点からは、ピボットの前に親を作成する必要があると思います。確かに可能ですが、現在実装されていない可能性があります。 – Blueberry

+0

このようなピボットテーブルがあり、生成されたIDを使用する代わりに他の識別子を外部キーとして使用すると、可能性があります。これで、ピボットテーブルを保存してから、投稿と関連タグを保存することができます。 – Sandeep

答えて

1

これは、実際にはかなり簡単です。これは、タグの関係alaクエリビルダーにアクセスするつもりですが、あなたの投稿にタグを追加するだけで何を探しているのですか?

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メソッドに対処するだけでなく、すべてを内部的に標準モデルに変換するというアイディアでした。これを保存したり、いくつかのアクションを実行したり、投げ捨てたり、まったく保存せずにビューに直接使用することもできます。私がストアしたければ、モデル全体をDBにプッシュするだけです。より標準的なアプローチは何でしょうか? – Blueberry

+0

私は見ていますので、上記の例では、あらかじめポピュレートされた永続化されていないPostオブジェクトを渡しています。私は、フロントエンド(vuex.vuejs.org参照)にこのようなものをすべて保持したり、状態永続性パターンを使用したりする場合、ユーザーがフロントエンドからAPIにPostオブジェクトをチャッキングするだけの場合フロントエンドのフレームワークなしでここでやっていることと同様の考えです。たぶんあなたはあなたのウェブスタックから何かが必要な場所にいるのでしょうか? Laravelを使用するのは、フロントエンドでのメンテナンスが容易な場合には、これが過度であるように思えます。思考のための食べ物 – ExohJosh

+0

実際、投稿とタグの例は私のアプリケーションにはまったくありません。私が何をしようとしているかを実証するだけでした。簡単に言えば、私はEloquentモデルがデータを保持する単なる手段ではなく、必要に応じて簡単に格納できるという考えを持っています。あなたの答えで言うように、私はモデルのいくつかのカスタマイズを信じています、それはまだ可能です、私はピボットを処理するために各クラスを少しカスタマイズする必要があります。しかし、あなたはそれが必要かどうかを考えさせてくれました。ありがとう! – Blueberry

関連する問題