【发布时间】:2015-06-27 08:50:38
【问题描述】:
我正在使用 Laravel 并陷入困境。我有以下型号:
- 类别
- 产品
- 类别产品
CategoryProduct 持有关于哪个产品属于哪个类别的信息(一个产品可能属于多个类别)。
现在,当我想加载属于特定类别的所有产品时,我需要在 Product 和 CategoryProduct 上运行查询,这是我遇到的问题。
我尝试了以下方法,但没有成功:
$products = Product::where('status', '=', 'active')
->where('category_id', '=', $category_id)
->take($count)
->skip($skip)
->get();
显然,它会说category_id 不是一个列。
这是我的数据库和模型结构:
类别表
身份证, 姓名, 等等
产品表
身份证, 姓名, 货号, 等等
category_products 表
身份证, product_id,(Product.id 的外键) category_id,(Category.id 的外键) 等等
产品型号
class Product extends Eloquent {
protected $table = 'products';
protected $hidden = array();
public static $rules = array('name' => 'required|min:3');
}
类别模型
class Category extends Eloquent {
protected $table = 'categories';
public static $rules = array('name' => 'required|min:3');
}
类别产品型号
<?php
class CategoryProduct extends Eloquent {
protected $table = 'category_products';
public function product()
{
return $this->belongsTo('Product');
}
public function category()
{
return $this->belongsTo('Category');
}
}
更新
关于此的新问题
我正在尝试展示产品。如果没有通过类别(值为-1),那么我将显示所有产品,否则我将显示来自通过的类别的产品。
现在,当我展示所有产品时,这些产品可能已经存在于一个类别中。我想为已经在一个类别中的产品显示勾选的复选框。我正在做这样的事情:
if($category_id==-1)
$products = Product::where('status', '=', 'active')->take($count)->skip($skip)->get();
else{
$products = Product::whereHas('categories', function($q) use ($category_id)
{
$q->where('category_id', $category_id);
})->where('status', 'active')
->take($count)
->skip($skip)
->get();
}
category_products 表有 product_id、category_id 作为列。
现在,查询:
$products = Product::where('status', '=', 'active')->take($count)->skip($skip)->get();
将仅从 products 表中挑选产品。如果我在 category_products 中检查每个产品是否存在,那么对于大量产品的数据库查询将过多。
任何想法,如何实现这一点。我希望我能够清除我的情况。谢谢
【问题讨论】:
-
查看
has/whereHas函数。
标签: laravel eloquent relationship