Nov 4, 2016
0
Level 1
Problem complex query versus Eloquent Model
Hello, guys, I have a specific problem ... I build a query to get results from some tables in the database ... it is ok.. .when running this directly on a database, the result set returned is more than 20 records ... ok ... but when I try to run this query using Eloquent models, and the resultset returns 3 records.. and this is crazy ... because the log generated by Laravel is the same ...
This is my query:
select
t . *
from
((select
`products` . *
from
`products`
inner join `products_config` ON `products_config`.`id` = `products`.`published_product_config_id`
inner join `companies` ON `companies`.`id` = `products`.`company_id`
left join `maker_connection_settings` ON `maker_connection_settings`.`company_id` = `companies`.`id`
and `maker_connection_settings`.`active` = 1
left join `maker_connection_types` ON `maker_connection_types`.`id` = `maker_connection_settings`.`maker_connection_type_id`
where
`products`.`status` = 'active'
and `products_config`.`status` = 'published'
and (`maker_connection_types`.`id` = 1
or `maker_connection_types`.`id` is null)
group by `products`.`id`
order by `products`.`created_at` desc) union (select
`products` . *
from
`products`
inner join `products_config` ON `products_config`.`id` = `products`.`published_product_config_id`
inner join `companies` ON `companies`.`id` = `products`.`company_id`
inner join `maker_connection_settings` ON `maker_connection_settings`.`company_id` = `companies`.`id`
and `maker_connection_settings`.`active` = 1
inner join `maker_connection_types` ON `maker_connection_types`.`id` = `maker_connection_settings`.`maker_connection_type_id`
where
`products`.`status` = 'active'
and `products_config`.`status` = 'published'
and (`maker_connection_types`.`id` = 2
or `maker_connection_types`.`id` is null)
and `products`.`company_id` in (3 , 6, 8)
group by `products`.`id`
order by `products`.`created_at` desc) union (select
`products` . *
from
`products`
inner join `products_config` ON `products_config`.`id` = `products`.`published_product_config_id`
inner join `companies` ON `companies`.`id` = `products`.`company_id`
inner join `maker_connection_settings` ON `maker_connection_settings`.`company_id` = `companies`.`id`
and `maker_connection_settings`.`active` = 1
inner join `maker_connection_types` ON `maker_connection_types`.`id` = `maker_connection_settings`.`maker_connection_type_id`
where
`products`.`status` = 'active'
and `products_config`.`status` = 'published'
and (`maker_connection_types`.`id` = 3
or `maker_connection_types`.`id` is null)
and exists( select
`s`.`store_id`
from
`maker_connection_settings_stores` as `s`
where
`s`.`store_id` = 3
and `s`.`maker_connection_setting_id` = maker_connection_settings.id
limit 1)
group by `products`.`id`
order by `products`.`created_at` desc)) t
where
`t`.`id` not in (select
product_id
from
`store_products`
where
`store_products`.`store_id` = 3)
limit 200 offset 0
And this my code with using Eloquent Models
....
$userData = AppAuth::getUserData();
$companies = array_unique( array_pluck(json_decode($userData['roles']), 'company_id') ); // eg: array(1,2,4)
$storeId = $request->input('store', 0);
$query = Product::getProductsToSellSearch($request);
$query1 = clone $query;
$query1->join('companies', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('companies.id', '=', 'products.company_id');
})->leftJoin('maker_connection_settings', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_settings.company_id', '=', 'companies.id');
$join->on('maker_connection_settings.active', '=', \DB::raw(1));
})->leftJoin('maker_connection_types', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_types.id', '=', 'maker_connection_settings.maker_connection_type_id');
})->whereNested(function(\Illuminate\Database\Query\Builder $query) {
$query->where('maker_connection_types.id', MakerConnectionType::PUBLIC_MAKER);
$query->orWhere('maker_connection_types.id');
});
$query2 = clone $query;
$query2->join('companies', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('companies.id', '=', 'products.company_id');
})->join('maker_connection_settings', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_settings.company_id', '=', 'companies.id');
$join->on('maker_connection_settings.active', '=', \DB::raw(1));
})->join('maker_connection_types', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_types.id', '=', 'maker_connection_settings.maker_connection_type_id');
})->whereNested(function(\Illuminate\Database\Query\Builder $query) {
$query->where('maker_connection_types.id', MakerConnectionType::ONLY_MY_COMPANY_STORES);
$query->orWhere('maker_connection_types.id');
})->whereIn('products.company_id', $companies);
$query3 = clone $query;
$query3->join('companies', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('companies.id', '=', 'products.company_id');
})->join('maker_connection_settings', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_settings.company_id', '=', 'companies.id');
$join->on('maker_connection_settings.active', '=', \DB::raw(1));
})->join('maker_connection_types', function (\Illuminate\Database\Query\JoinClause $join) {
$join->on('maker_connection_types.id', '=', 'maker_connection_settings.maker_connection_type_id');
})->whereNested(function(\Illuminate\Database\Query\Builder $query) {
$query->where('maker_connection_types.id', MakerConnectionType::SELECTED_STORES);
$query->orWhere('maker_connection_types.id');
})->whereExists(function(\Illuminate\Database\Query\Builder $query) use($storeId){
$query->select(['s.store_id'])->from('maker_connection_settings_stores as s')
->where('s.store_id', $storeId)
->where('s.maker_connection_setting_id','=','maker_connection_settings.id')
->limit(1);
});
$query = Product::select(\DB::raw('t.*'))
->from(\DB::raw('('.$query1->union($query2)->union($query3)->toSql().') t'))
->mergeBindings($query1->getQuery())
->mergeBindings($query2->getQuery())
->mergeBindings($query3->getQuery())
->whereNotIn('t.id', function(\Illuminate\Database\Query\Builder $query) use($storeId){
$query->select(DB::raw('product_id'))->from('store_products')
->where('store_products.store_id','=',$storeId);
})
;
$products = $query->paginate($request->input('limitPerPage', 6));
Someone knows because this problem occurs ?
Please or to participate in this conversation.