【问题标题】:Laravel Controller for CRUD without querying Database inside Controller's methods用于 CRUD 的 Laravel 控制器,无需在控制器方法中查询数据库
【发布时间】:2019-03-17 01:13:21
【问题描述】:

是否可以在 CRUD 方法中传递正确的模型对象,而无需在方法本身内部查询数据库?

如果您查看文档,您可以看到控制器的方法接受来自 URL 的 ID 作为参数。

https://laravel.com/docs/5.7/controllers

但是,如果您使用 artisan CLI 生成控制器,那么这些方法接受的不是 ID 作为参数,而是 Request 对象和/或 Model 对象,例如 Post $post。 那么,如何确保 Laravel 为我正确查询数据库并将模型作为参数传递?如果我尝试这个,视图会正确呈现,但数据不会作为响应传递。

文档中的示例方法

 /**
 * Show the profile for the given user.
 *
 * @param  int  $id
 * @return Response
 */
public function show($id)
{
    return view('user.profile', ['user' => User::findOrFail($id)]);
}

来自 CLI 生成的控制器的示例方法

    /**
 * Display the specified resource.
 *
 * @param  \App\Order  $order
 * @return \Illuminate\Http\Response
 */
public function show(Order $order)
{
    //
}

注意参数的不同。

运行工匠命令

php artisan make:model 命令 -mcr 参考:https://quickadminpanel.com/blog/list-of-16-artisan-make-commands-with-parameters/

解决方案

你不用看https://laravel.com/docs/master/routing#route-model-binding,Explicit Binding,在AppServiceProvider的boot中Router中定义模型如下:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Route::model('ordini', \App\Order::class);
}

【问题讨论】:

  • 嗨@Mattia - 我尝试阅读您的问题,但根本无法弄清楚您的问题中的正面和反面。如果可以的话,我很乐意提供帮助,但是您能否重新编写问题,以便有一个更有条理的方法,也许还可以发布一些有问题的代码。
  • 嗨@Patrick,看看我的编辑,如果您需要更多编辑,请告诉我。

标签: php laravel command-line-interface laravel-artisan


【解决方案1】:

我认为您正在寻找路由模型绑定 https://laravel.com/docs/master/routing#route-model-binding

如果您有类似user/{user} 的路由,您可以使用类型提示解析用户模型

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  \App\User  $user
     * @return Response
     */
    public function store(\App\User $user)
    {
        $name = $user->name;

        //
    }
}

【讨论】:

  • 你好,如果我试试这个 ` /** * 显示指定的资源。 * * @param \App\Order $order * @return \Illuminate\Http\Response */ public function show(\App\Order $order) { return view("orders.show")->with("order", $订单); }` 我在视图中得到[](一个空数组)。路由是标准的,由 Route::resources() 方法生成。
  • 我已经测试了路由模型绑定,它仅在我使用 Route::get() 手动定义路由时才有效。如果我使用 Route::resources() 不起作用。正常吗?
  • 你好)它也应该与 Route::resources('orders') 一起使用
  • 您好,请看问题的最后解决方案。
  • 这就是为什么我要求显示路由:列表。使用参数顺序orders/{order},您不需要显式模型绑定
猜你喜欢
  • 1970-01-01
  • 2016-01-16
  • 2016-12-30
  • 2013-01-23
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多