фильтровать продукт, который есть в наличии - PullRequest
0 голосов
/ 09 января 2020

моя модель:

product =>  
    id  
    ...  
store=>  
    product_id  
    quantity  
    is_come // for detect that is income product or this product sell 

Теперь, как я могу написать запрос (eloquent Builder) без превращения в коллекцию, которая фильтрует продукт, который на сумму is_come = true больше, чем is_come = false что-то, что я пишу, что это неправильно Пожалуйста, помогите мне

if (request('isAvailable')){
    $data = $data->whereHas('store',function ($q){
        $q->when(true, function ($a){
            return $a->where('is_come', false)->sum('quantity')
                > $a->where('is_come', true)->sum('quantity');
        });
    });
}

или что-то в этом роде

$data = $data->whereHas('store', function ($q){
            $q->where(function ($a) {
                return $a->where('store.is_come', 1)
                    ->sum('quantity');
            },
                '>'
                , function ($a) {
                    return $a->where('store.is_come', 0)->sum('quantity');
                  });
        });

$data это экземпляр модели продукта

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Я нашел способ для этого решения, но мне нужен красноречивый способ запроса для моих резервуаров с решениями для @ Ahmed-shefeer

$storeProductIds = Store::select('product_id',
            DB::raw('SUM(CASE WHEN store.is_come = 1 THEN quantity END) AS sum_1'),
            DB::raw('COALESCE(SUM(CASE WHEN store.is_come = 0 THEN quantity END),0) AS sum_0')
        )->groupBy('product_id')->havingRaw('sum_1 - sum_0>0')->get()->pluck('product_id')->toArray();
        $data = Product::whereHas('store', function ($q) use ($storeProductIds) {
            $q->whereIn('product.id', $storeProductIds);
        })->get();
0 голосов
/ 09 января 2020

Вы должны найти идентификаторы продуктов, соответствующие условию, в модели Store, а затем использовать их в своем запросе.

$storeIds = Store::select('product_id', 
    DB::raw('SUM(CASE WHEN store.is_come = 1 THEN quantity END) AS sum_1'),
    DB::raw('SUM(CASE WHEN store.is_come = 0 THEN quantity END) AS sum_0'),
)->whereRaw('sum_1 > sum_0')->get()->pluck('product_id');

$data = Product::whereHas('store',function ($q) use ($storeIds){
    $q->whereIn('id', $storeIds);
})->get();

Код не проверен, но надеюсь, что вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...