Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
588 views
in Technique[技术] by (71.8m points)

php - Laravel polymorphic relations: Passing model to controller

I want to use a single controller to save my comments for multiple models. So I created the CommentController, with the following store method:

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();
    }

In my view, I have:

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

This is working. If I want to use the same CommentController to store the comments for a school, how should I modify the store method of the controller?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Adam's solution is great, but I would not hard-code the model's namespace that way. Instead, what I would do is make use of Laravel's Relation::morphMap(), you can check it out here: https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations

That way, you will also make your database entries more readable. I recommend using a service provider to map the morphs.

Also, the Model base class has a getMorphClass() method, so instead of $comment->commentable_type = 'App\Models\'.$model; I would use $comment->commentable_type = $model->getMorphClass();

That way you integrate Laravel's logic into your code.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...