如何使用雄辩的方式在Laravel中获得复杂的关系

时间:2017-12-21 05:45:27

标签: php laravel-5 laravel-eloquent

我有以下表格

用户

id
name

公司

id
user_id
name

产品类别

id
company_id
name

产品

id
product_category_id
name

销售

id
product_id
price
quantity
total

现在我想获得指定用户产品的所有销售。我试过以下查询。但我不能在这里使用。它不适用于此过滤器。此外,我想通过其他几个字段过滤它,如users.user_name,products.product_name ... etc

$sales = Sale::with(['product'=>function($q) use ($user_id) {
        $q->with(['product_category' => function($q) use ($user_id) {
            $q->with(['company'=> function($q) use ($user_id) {
                $sUserName = Input::get('sUserName');
                $q->with(['user'=> function($q) use ($sUserName,$user_id) {
                    $q->where('id', $user_id);
                }]);
            }]);
        }]);
    }]);

在这些情况下是否可以使用Eloquent?或者我应该使用加入查询?请指教。感谢

2 个答案:

答案 0 :(得分:0)

你可以像这样使用laravel eloqunt。

$ Sales = DB :: table(' Sales')          - >加入('产品',' Sales.product_id',' =',' Products.id')          - >加入(' ProductCategories',' ProductCategories.id',' =',' Products.product_category_id')          - >加入('公司',' ProductCategories.company_id',' =',' companies.id')          - >加入('用户',' companies.user_id',' =',' Users.id')          - >选择('销售*'。)          - >得到();

答案 1 :(得分:0)

madalinivascu建议之后,我可以解决我的问题,如下所示。现在我可以通过订购用户,产品名称&日期。

$sUserName = Input::get('sUserName');
    $sProductName = Input::get('sProductName');
    $sFrom = Input::get('sFrom');
    $sTo = Input::get('sTo');

    $user_id = \Auth::User()->id;


    // Show sales only for his products
    $sales = Sale::with('sold_to_user')
        ->whereHas('sold_to_user', function($q) use ($sUserName) {
            if(!empty($sUserName)) $q->where('name','LIKE', "$sUserName%");
        })->with('product')
        ->whereHas('product', function($q) use ($sProductName) {
            if(!empty($sProductName)) $q->where('name','LIKE', "$sProductName%");
            });

    if(\Auth::User()->privilege!='administrator') $sales = $sales->where('user_id','=',$user_id);


    $sales = $sales->orderBy('updated_at','desc')->paginate(100);