2016-11-02 4 views
1

複数のモデルのコメントを保存するためにコントローラを1つ使用したいと思います。だから私は、次の店の方法で、CommentControllerを作成:ラーベル多相関係:コントローラにモデルを渡す

public function store(Teacher $teacher, Request $request) 
    {  
     $input = $request->all(); 

     $comment = new Comment(); 

     $comment->user_id = Auth::user()->id; 
     $comment->body = $input['body']; 

     $teacher->comments()->save($comment); 

     return redirect()->back(); 
    } 

を私の見解では、私が持っている:これは働いている

{!! Form::open([ 
    'route' => ['teachers.comments.store', $teacher->id] 
]) !!} 

。私が同じCommentControllerを使って学校のコメントを保存したいのであれば、コントローラのストアメソッドをどのように変更すればよいですか?

答えて

1

イムこれはLaravelのconvensionですが、私は次のことを行っているかどうかわからない:

はルートを作った:

Route::post('/Comment/{model}/{id}', [ 
    // etc 
]); 

次にコントローラでモデルを取得し、許可の配列に対してチェックモデルは、通じIDを渡すと添付:私が言うのように

public function store(Request $request, $model, $id) { 
    $allowed = ['']; // list all models here 

    if(!in_array($model, $allowed) { 
     // return redirect back with error 
    } 

    $comment = new Comment(); 
    $comment->user_id = $request->user()->id; 
    $comment->commentable_type = 'App\\Models\\'.$model; 
    $comment->commentable_id = $id; 
    $comment->body = $request->body; 
    $comment->save(); 

    return redirect()->back(); 
} 

は、最も可能性の高い達成するためにはるかに良い方法があるが、これは、私はそれをやった方法です。それは短くて甘いとモデルがコメントを取ることができるかどうかをチェックします。

+0

解決に感謝します!私は '' App \\ Models \\ 'を変更しなければならなかった。 $ model; 'を' 'App \\ 'に変更します。 $ model; ' – user3253002

+1

ああ、申し訳ありません、私は通常モデルディレクトリにすべてのモデルを入れます。それはあなたのために働いてうれしい:) – Adam

0

アダムのソリューションは素晴らしいですが、私はモデルの名前空間をそのようにハードコードしません。代わりに、LaravelのRelation::morphMap()を使用することです。https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations

このようにして、データベースエントリを読みやすくすることもできます。私は、サービスプロバイダーを使ってモーフをマッピングすることをお勧めします。

また、Model基底クラスは、私は $comment->commentable_type = $model->getMorphClass();

あなたのコードにLaravelのロジックを統合する方法を使用することになり、その代わりに $comment->commentable_type = 'App\\Models\\'.$model; getMorphClass()方法があります。

関連する問題