在 blade 视图中访问控制器功能的正确方法是什么 - Laravel

What is the proper way to access the controller function inside the blade view - Laravel

我是 laravel 的新手。我要访问 products 属于 category。它们之间存在 One-to-Many 关系。为了获取这些数据,我在 ProductsController 中创建了一个名为 getCtgProducts() 的函数来执行此操作。

我知道直接从视图查询数据库是一种不好的做法,因此我在控制器中编写数据库查询并尝试在 blade.

中访问它

谁能告诉我哪里做错了?

在 blade 视图中访问控制器功能的正确方法是什么? 我正在使用 Laravel Framework v9.7.0

@foreach ($ctgs as $ctg)
    <h1> $ctg->name </h1>        // -- It is working. Showing the correct ctgs names
    <div class=container>
        @if (isset($products))
            @foreach ({{ App\Http\Controllers\ProductsController::getCtgProducts($ctg->id) }} as $product)
                <h1> $product->name </h1>
            @endforeach
        @endif
    </div>
@endforeach

ProductsController class


<?php
namespace App\Http\Controllers;
use App\Models\Ctg;
use App\Models\Product;

class ProductsController extends Controller
{
    public function index(Request $request)
    {
        $products = Product::all();
        $ctgs = Ctg::all();
        return view('ui\welcome', compact('products', 'ctgs'));
    }
    
    public static function getCtgProducts(){
        $ctgProducts = DB::table('products')->where('ctg_id', $ctgId);
        return $ctgProducts;
    }
}

从 blade 调用控制器是不好的做法 将您的 getCtgProducts() 方法逻辑移动到 Category Model:

public function getCtgProducts(){
    $ctgProducts = DB::table('products')
      ->where('ctg_id', $this->id)->get();
    return $ctgProducts;
}

Blade 文件:

@foreach ($ctgs as $ctg)
<h1> $ctg->name </h1>        // -- It is working. Showing the correct ctgs names
<div class=container>
        @foreach ($ctg->getCtgProducts() as $product)
            <h1> $product->name </h1>
        @endforeach
</div>
@endforeach

更好的方法: 因为有 one-to-many 关系 在类别模型中你应该有一个关系方法:

public function products() {
  return $this->hasMany(Product::class);
} 

Blade:

@foreach ($ctgs as $ctg)
  <h1> $ctg->name </h1>        // -- It 
  is working. Showing the correct ctgs 
  names
  <div class=container>
    @foreach ($ctg->products as 
     $product)
        <h1> $product->name </h1>
    @endforeach
  </div>
@endforeach