2017-09-02 10 views
1

私はこの問題をかなり数回経験しましたが、解決する効率的な方法を見ていません。Laravel多対多 - すべてのRealtionshipsのための1つのエントリ

私はProgモデルに対してbelongsToMany関係を持つサービスモデルを持っています。サービスフォームで

Service Model: 

public function relatedProgs(){ 
    return $this->belongsToMany('\App\Prog'); 
} 

彼らは$ IDを=> $名で複数選択を経由して好きなように、ユーザーは、できるだけ多くPROGSを添付することができます。 「すべて」を選択するオプションがあります。これはjqueryを使用してリスト内のすべてのprogをフォームに入力するだけです。数百のProgがあるので、これは愚かになります。

もちろん、jquery経由でフォームにすべてを追加する必要はありません。バックエンドにコードを追加してDBに追加することもできますが、本当にやりたいことはちょうどDBに "-1"を追加し、何百ものモデルを追加しないでください。 DBを小さくしておき、関係が-1の場合は、他のページにすべてを抜きます。

これを行う簡単でスマートな方法はありますか? id -1のモデルがなければ、progの-1 idがないので失敗します。私は "ALL" Progモデルを作成することができましたが、これは明らかに他の領域を壊してしまいます。

どのような考えですか?

答えて

0

おそらく、これを行うためのエレガントな方法はありません。たぶん誰かがより良い答えを持って来るだろう。今のところ、私は将来的に誰かが答えを求めている場合に備えて、私が行ったことを投稿します。

マルチ選択では、好きなだけ多くのアプリを追加できます。これは、通常のようにrelatedProgs-> attach/syncメソッドを使用してDBテーブルprog_serviceに直接入力されます。

このサービスではすべてのアプリケーションをDB(数百)に追加したい場合は、複数選択で[すべてのAPPS]をクリックできます。ストア/更新メソッドはこの-1 idを捕捉し、prog_serviceテーブルにNO関係を入力しません。また、フォームはjquery-populateで選択ボックスにも入力しません。その代わりに、Laravelメソッドは、新しいboolフィールド、サービスモデルのall_progs_relatedをtrueに割り当てるだけです。

長所:

  • 我々は関係を経由してハードリンクを使用する場合(新しく追加されたアプリは見られないだろうDB内の現在のアプリケーションを常に表示
  • (ない大したが)潜在的に巨大なprog_serviceテーブルを削減)
  • ベターUX:フォームは醜い複数選択

短所に起因するアプリケーションの数百スクリーンの底部を通って落下しない:

  • ハック/非雄弁(できない熱心な負荷すべてのアプリケーションのためだけブール)

  • すべてのアプリ「添付」/ Wサービスロジックを維持しなければならない触れるコードのすべての作品念頭に置いて。

IE:

if($service->all_progs_related) 
     $appList = \App\Prog::all(); 
    else 
     $appList = \App\Prog::whereIn('id', $service->relatedProgs->pluck('id')->get(); 
関連する問題