Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

felipemarques's avatar

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 ?

0 likes
0 replies

Please or to participate in this conversation.