4 回答
TA贡献1811条经验 获得超6个赞
假设你正确设置了你的关系(但事实并非如此)
您可以通过以下几种方式使用 Eloquent:
$products = Category::findOrFail($categoryId)->products;
$products = Product::where('category_id', $categoryId)->get();
$products = Product::whereHas('category', function ($query) use ($categoryId) {
$q->where('id', $categoryId);
})->get();
TA贡献1810条经验 获得超5个赞
首先,你没有正确定义你们的关系。它应该是这样的:
class Product extends Model
{
public function category()
{
return $this->belongsTo('App\Category');
}
}
class Category extends Model
{
public function products()
{
return $this->hasMany('App\Product');
}
}
然后在您的产品迁移文件中,cat_id 应重命名为category_id。这样,您就不需要在关系上指定外键。
我假设您想列出属于特定类别的所有产品。您可以使用路由模型绑定轻松地做到这一点。在这种情况下,您的路线应类似于:
Route::get('categories/{category:id}/products', [CategoryController::class, 'products']);
然后在你的控制器中:
use App\Category;
class CategoryController extends Controller
{
public function products(Category $category)
{
$category->load('products');
return view('products')->withCategory($category);
}
}
您可以在刀片视图中访问产品列表,如下所示:$category->products
TA贡献1155条经验 获得超0个赞
您需要对您的Category模型进行调整,因为Category有很多Products。就目前而言,关系的命名并没有反映出这一点
class Category extends Model
{
public function products()
{
return $this->hasMany('App\Product');
}
}
然后您可以通过Category模型访问产品,如下所示。
$categories = Category::with('products')->all();
$categories->each(function($category) {
$products = $category->products;
// Dump & Die a collection of products
dd($products);
});
注意: 我已使用 with() 方法预先加载关系,这只是为了防止 n+1 查询。有关急切加载和延迟加载的更多信息可以在文档中找到。
TA贡献1847条经验 获得超11个赞
你可以做类似的事情,
$products = product::with('categories')->get();
foreach($products as $product)
{
foreach($product->categories as $category)
{
echo $category->name;
}
}
$categories = Category::with('products')->get();
$category = Category::with('products')->find($category_id);
- 4 回答
- 0 关注
- 144 浏览
添加回答
举报