我从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) {
中存在的变量。
有没有更好,更优雅的方法来解决我的问题?
答案 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();
}
我从未使用过多态关系,但这是我可能要做的事情。