【问题标题】:Get delete id in controller to delete mysql record获取控制器中的删除ID以删除mysql记录
【发布时间】:2021-03-28 11:37:15
【问题描述】:

我在 AuthController 中有这个:

public function DelFunc() {

    if(Auth::check() === true) {
        $deleted = DB::delete('delete from funcionarios where id = ?',[$id]);
    }
    return redirect()->route('admin.login');
}

但我收到此错误:未定义变量:id

我的视图中有这个按钮:

<a href="../admin/delFunc?id={{$empresa->id}}">
    <button class="btn btn-primary">Delete</button>
</a>

我知道我的问题很简单,但是,如何获取 AuthController 上的 id 值来删除这条记录?

我也有这条路线:

Route::get('/admin/delFunc', [App\Http\Controllers\AuthController::class, 'delFunc'])->name('delFunc');

【问题讨论】:

    标签: php laravel laravel-routing


    【解决方案1】:

    这里有一堆危险信号:

    • 为什么当它使用 Funcionario 对象时,它会进入一个名为 AuthController 的控制器?
    • 为什么直接查询数据库而不是使用 Eloquent 模型?
    • 您不应该通过 GET 方法删除项目,这非常危险。
    • 身份验证由中间件完成,而不是通过检查每个控制器方法。
    • 最后,您的方法还应该有一个更传统的名称,例如 destroy

    路由参数在路由定义中用大括号“/admin/delete/{func}”定义,然后绑定到控制器方法定义中的对象。

    所以,把所有这些放在一起,它应该是这样的:

    <?php
    
    use App\Http\Controllers\FuncionarioController;
    use Illuminate\Support\Facades\Route;
    
    Route::middleware("auth")->group(function ($router) {
        $router->delete('/funcionario/{func}', [FuncionarioController::class, 'destroy'])
            ->name('funcionario.destroy');
    });
    

    然后在你的控制器中:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\Funcionario;
    
    class FuncionarioController extends Controller {
    
        public function destroy(Funcionario $func)
        {
            $func->delete();
            return redirect()
                ->route('admin.login')
                ->with('success', __('Funcionario deleted'));
        }
    }
    

    假设您的值在$id 变量中传递,您的视图将如下所示:

    <form method="post" action="{{ route("funcionario.destroy", $id) }}">
        @method('DELETE')
        @csrf
        <button type="submit">{{ __("Delete") }}</button>
    </form>
    

    【讨论】:

    • 没问题,希望一切都有意义!
    • 方法名destroy比较合适,路由名functionario.destroy根据laravel docs
    • 你的回答很完美,所以我想我也会补充一点:)
    • 那么第一个带有Route::middleware的函数我放在web.php中,对吗?在第二个我得到这个错误:意外'破坏'(T_STRING),期待变量(T_VARIABLE)。并从mysql中删除我应该使用什么?再次感谢,抱歉我缺乏知识。
    • 是的,路由进入 web.php。我希望我的代码中的简单拼写错误应该很容易修复。你不使用 SQL,这是 Laravel 的一半。你只需删除 Eloquent 实例。
    【解决方案2】:

    [request('id')]代替[$id]

    【讨论】:

    • 这是绝对正确的,但这是一种非常简单的方法,并没有开始解决代码的所有其他问题。
    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2011-11-20
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多