我有一个带有版本化数据的产品型号,我有一个可以有一个或多个产品的类别模型。当我想删除某个类别时,代码必须检查是否有与该类别相关的产品。如何定义关系,以便在删除之前进入products_version
表以检查category_id
是否存在?
这是我的产品型号:
use Versionable, SoftDeletes;
protected $fillable = ['product_name', 'supplier', 'unit', 'pieces', 'desired_stock', 'current_stock', 'category_id', 'price'];
public $timestamps = true;
public $versioned = ['category_id', 'product_name', 'supplier','unit','desired_stock','current_stock','price','pieces', 'deleted_at'];
public function parent()
{
return $this->belongsTo('App\Category');
}
产品的版本控制正在发挥作用。我使用了以下代码:https://github.com/ProAI/eloquent-versioning
我的分类模型:
public function products()
{
return $this->hasMany('App\Product');
}
我用来检查是否有与该类别相关的产品的代码:
public function destroy($id)
{
// delete
$category = Category::withCount('products')->where('id', '=', $id)->first();
if ($category->products_count > 0) {
Session::flash('message', 'Can not delete category');
} else {
$category->delete();
// redirect
Session::flash('success', 'Category deleted');
}
return Redirect::to('categories');
}
我得到的错误消息:
SQLSTATE [42S22]:找不到列:1054未知列 'where子句'中的'products.category_id'(SQL:选择
categories
。, (从products
内部联接products_version
选择计数()products
。id
=products_version
。ref_id
和products_version
。version
=products
。latest_version
其中categories
。id
=products
。category_id
和 来自products_version
的{{1}}。deleted_at
为空)products_count
其中categories
= 1限制1)
答案 0 :(得分:1)
您可能需要has many through
关系
public function products()
{
return $this->hasManyThrough('App\Product', 'App\ProductVersion');
}
所以它会将Category
与Product
到ProductVersion
相关联,因为'category_id'
仅存在于ProductVersion
查看Laravel Docs了解详情
P.S。您可能需要为ProductVersion
表格
products_version
模型
答案 1 :(得分:0)
这可能有效:
$category = Category::withCount('products' => function($q) {
$q->where('id', '=', $id);
})->first();