在 Laravel 8 中为 crud 显示 slug 而不是 id

Posted

技术标签:

【中文标题】在 Laravel 8 中为 crud 显示 slug 而不是 id【英文标题】:Showing slug instead of id for crud in Laravel 8 【发布时间】:2021-01-18 15:17:00 【问题描述】:

我正在对我的 laravel crud 项目进行编辑部分。当我按下编辑时,它将重定向到edit.blade.php,它将调用蛞蝓而不是他们的ID。我已经研究过了,它显示了Too few arguments to function App\Http\Controllers\ProductController::edit(), 1 passed and exactly 2 expected

的错误

我的路线

Route::get('edit/slug', $url. '\productController@update');
Route::get('edit', $url. '\productController@edit');

我的 ProductController::edit()

public function edit(Product $product, $slug)
    
        return view('edit', compact('product'));
    

我的 ProductController::update()

public function update(Request $request, Product $product, $slug)
    
        Product::where('product_slug',$request->$slug)->update([
            'product_title' => $request->title,
            'product_slug'  => $request->slug,
            'product_image' => $request->image
            ]);

            // redirect
            return redirect('edit');
    

任何帮助将不胜感激,在此先感谢

【问题讨论】:

该编辑路由的 URI 中没有路由参数,更新可能不是 GET 路由 看看laravel.com/docs/8.x/routing#route-model-binding 【参考方案1】:

您无需担心任何事情。只需将以下代码添加到您的产品模型中:

public function getRouteKeyName()

    return 'slug';

Laravel 会处理剩下的事情。欲了解更多信息,请访问下面的链接,那里有很好的解释:

https://laravel.com/docs/8.x/routing#customizing-the-default-key-name

【讨论】:

【参考方案2】:

在您的编辑按钮中传递 id 而不是 slug

<a href="url('edit/'$id'')" class="btn btn-info btn-sm" />Edit</a>

并更改您的更新功能

public function update(Request $request, Product $product, $id)

    Product::where('id_column_name', $id)->update([
        'product_title' => $request->title,
        'product_slug'  => $request->slug,
        'product_image' => $request->image
        ]);

        // redirect
        return redirect('edit');

【讨论】:

【参考方案3】:

您收到此错误是因为您的方法中有 2 个参数:Product $product$slug。要解决此错误,您应该删除其中一个。

您还需要将slug 参数添加到您的edit 路由,以便在您的控制器中访问它。你的update 路由应该是PUTPATCH

类似这样的:

Route::get('products/slug/edit', [ProductController::class, 'edit'])
Route::patch('products/slug', [ProductController::class, 'update'])

因此,您可以删除Product $product 并使用$slug 获取产品:

public function edit($slug)

  $product = Product::where('product_slug', $slug);

  return view('edit', compact('product'));


public function update(Request $request, $slug)

  Product::where('product_slug', $slug)->update([
    'product_title' => $request->title,
    'product_slug'  => $request->slug,
    'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');


或者您可以删除$slug 并使用Product $product,方法是将slug 设置为您的路由键并将路由参数更改为product

// Product model
public function getRouteKeyName()

  return 'slug'


// Product controller
public function edit(Product $product)

  return view('edit', compact('product'));


public function update(Request $request, Product $product)

  $product->update([
    'product_title' => $request->title,
    'product_slug'  => $request->slug,
    'product_image' => $request->image
  ]);

  // redirect
  return redirect('edit');


// Route
Route::get('products/product/edit', [ProductController::class, 'edit'])
Route::patch('products/product', [ProductController::class, 'update'])

【讨论】:

以上是关于在 Laravel 8 中为 crud 显示 slug 而不是 id的主要内容,如果未能解决你的问题,请参考以下文章

使用 modal 的 Laravel 8 crud 不向数据库添加数据

Laravel 5.4:无法在视图中显示 crud 内容

如何为 Laravel 模块架构应用 CRUD 生成器?

Laravel 5.5 CRUD 表单选择的正确方法

如何在 laravel 8 中为 API 返回验证规则和消息作为 JSON

如何在 Laravel 8 中为完整的日历 JS 插件添加额外的字段值