【问题标题】:Showing slug instead of id for crud in Laravel 8在 Laravel 8 中为 crud 显示 slug 而不是 id
【发布时间】: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');
    }

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

【问题讨论】:

标签: laravel crud slug


【解决方案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'])
      

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 2021-12-27
        • 2019-10-07
        • 1970-01-01
        • 2019-05-11
        • 2020-11-26
        • 2021-08-26
        • 1970-01-01
        • 2015-10-11
        相关资源
        最近更新 更多