【问题标题】:Where to put Logic to show Children-Items of a Model在哪里放置逻辑以显示模型的子项
【发布时间】:2019-02-17 02:34:27
【问题描述】:

假设我们有以下两个模型:CategoryModel(hasMany ProductModel)和一个ProductModel

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

你会把这个逻辑放到 CategoryController 中吗?在一个名为 details 或类似 (CategoryController::details($categoryId)) 的函数中,或者逻辑是否会显示某个类别的产品移动到 ProductController::index($categoryId)

【问题讨论】:

    标签: laravel


    【解决方案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,我们返回的视图是指产品目录。所以你应该把你的代码放在 ProductsController 中

    顺便说一句,如果你想让你的代码干净,你可以使用 laravel 模型范围,你的代码将被更改为:

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

    所有的过滤脚本都将在过滤范围之后

    【讨论】:

      【解决方案2】:

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

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

      你也可以在 Laravel 文档中查看nested resources

      【讨论】:

      • 这是您使用的另一种方式,而且很酷。但不要忘记,在这种情况下,您会进行两个数据库查询,一个用于获取 Category,另一个用于获取 Category 的子项。
      • 您可以通过连接加载相关模型。我试图解释的是处理资源丰富的 REST soubroutes 的公认方法,您还可以查看here 或 Rails 文档的子路由。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2011-09-08
      • 1970-01-01
      • 2011-06-03
      • 2011-08-02
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多