Laravel-控制器处理多种模型

时间:2019-05-17 17:20:17

标签: laravel

我从Laravel开始。我有LinksController处理我的链接表(CRUD)。我想使用此表存储我应用程序中的所有链接。

我有两个表:

  • 教程
  • 帖子

LinksController.php

public function store(Request $request, Tutorial $tutorial) {

    $link = new Link;
    $link->user_id = auth()->user()->id;
    $link->source_id = $tutorial->id;
    $link->link = $request->link;
    $link->save();
}

这很好。现在,我试图保存帖子链接,我发现我的路线模型绑定只能使用一个模型。

路线:

tutorials/{tutorial}/links
posts/{post}/links

如果我将Tutorial $tutorial的{​​{1}}更改为适用于帖子,但不适用于教程。

我了解了多态关系,但不确定如何将不同的模型传递给Post $post

我应该在我的LinksController.php中使用类似的东西吗?

LinksController

我知道我可以使用隐藏的输入来传递模型,但是我真的不想这么做。

修改: 我想到的其他解决方案是显式绑定:

RouteServiceProvider.php

private $model;

public function __construct(Request $request) {
    // if route a
    //     $this->model = Tutorial::class;
    // else
    //     $this->model = Post::class;
}

然后在我的Route::model('tutorial', \App\Tutorial::class); Route::model('post', \App\Post::class); 存储方法中:

LinksController

您认为这是个好方法吗?在这种情况下,路由中的第一个参数应始终是public function store(Request $request, Model $model) { 中存在的变量。

有没有更好,更优雅的方法来解决我的问题?

1 个答案:

答案 0 :(得分:1)

您应该在链接模型中为多态关系添加一个source_type字段。

$link->source_type = "tutorial" or "post"

路线可能类似于:

Route::post('/{sourceType}/{sourceTypeId}/links', 'LinksController@store')->where(['sourceType' => 'posts|tutorials', 'sourceTypeId' => '[0-9]+']);

然后在您的控制器中

public function store(Request $request, string $sourceType, int $sourceTypeId) {
    if ($sourceType == 'posts') {
        $source = Post::findOrFail($sourceTypeId);
    } elseif ($sourceType == 'tutorials') {
       $source = Tutorial:findOrFail($sourceTypeId);
    }

    $link = new Link;
    $link->user_id = auth()->user()->id;
    $link->source_id = $source->id;
    $link->source_type = substr($sourceType, 0, -1);
    $link->link = $request->link;
    $link->save();
}

我从未使用过多态关系,但这是我可能要做的事情。