Laravel雄辩,如何定义与版本控制的关系

时间:2018-04-04 12:56:48

标签: php laravel laravel-eloquent

我有一个带有版本化数据的产品型号,我有一个可以有一个或多个产品的类别模型。当我想删除某个类别时,代码必须检查是否有与该类别相关的产品。如何定义关系,以便在删除之前进入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选择计数()   productsid = products_versionref_id和   products_versionversion = productslatest_version其中   categoriesid = productscategory_id和   来自products_version的{​​{1}}。deleted_at为空)   products_count其中categories = 1限制1)

2 个答案:

答案 0 :(得分:1)

您可能需要has many through关系

之类的内容
public function products()
{
    return $this->hasManyThrough('App\Product', 'App\ProductVersion');
}

所以它会将CategoryProductProductVersion相关联,因为'category_id'仅存在于ProductVersion

查看Laravel Docs了解详情

P.S。您可能需要为ProductVersion表格

创建products_version模型

答案 1 :(得分:0)

这可能有效:

 $category = Category::withCount('products' => function($q) {
     $q->where('id', '=', $id);
 })->first();