在何处放置逻辑以显示模型的子项

时间:2019-02-16 18:05:30

标签: laravel

假设我们具有以下两个模型: CategoryModel (具有许多ProductModel)和 ProductModel

现在,用户导航到路线/categories,并看到类别列表(CategoryController::index())。用户现在可以单击一个类别以查看该类别中的产品。

您是否将此逻辑放入CategoryController?在称为明细或类似内容(CategoryController::details($categoryId))的函数中,还是在逻辑上,用于显示类别产品的商品移至ProductController::index($categoryId)

2 个答案:

答案 0 :(得分:1)

确实,用户单击了类别,但是您将与ProductModel进行交互,并且您可能会编写如下代码:

public function index(){
  $products=ProductModel::query();
  if($categoryId=\request('category_id')){
  $products->where('category_id',$categoryId);
  }
   $data=[
    "products"=>$products->get();
   ];
   return view("products.index",$data);
}

正如您在上面的代码中看到的,我们的主要模型是ProductModel,我们返回的视图引用了products目录。所以您应该将代码放入ProductsController

如果想使代码整洁,可以使用laravel模型作用域,代码将更改为:

public function index(){

 $data=[
  "products"=>ProductModel::filter()->get();
  ];
  return view("products.index",$data);
}

所有过滤脚本都将位于过滤范围之后

答案 1 :(得分:1)

恕我直言,我会去一个指向/categories/{category}/products函数的CategoryController::products($categoryId)路由。

对我来说,过滤后的/ products索引不太清楚,它可能会与产品REST路由产生混淆。

您还可以在Laravel文档中查看nested resources