Laravel, отличный от результатов соединения, не работает в построителе запросов

У меня есть таблица сообщений, в которой есть запрос на соединение с 4 другими таблицами. Три из них - отношения один к одному, а четвертый - один ко многим. Я хочу, чтобы запрос возвращал только 1 строку для каждого сообщения. То, что я пытаюсь до сих пор, похоже на это -

$query = DB::table('posts')
                ->select('posts.*',
                        'subcategories.subcategory_title_en',
                        'subcategories.subcategory_title_bn',
                        'categories.category_title_en',
                        'categories.category_title_bn',
                        'users.*',
                        'postimages.postimage_thumbnail'
                        )
                ->join('subcategories', 'subcategories.subcategory_id', '=', 'posts.subcategory_id')
                ->join('categories', 'categories.category_id', '=', 'subcategories.parent_category_id')
                ->join('users', 'users.id', '=', 'posts.user_id')
                ->join('postimages', 'postimages.post_id', '=', 'posts.post_id');

        $query->groupBy('posts.post_id');

        echo $query->count();
        exit();

В настоящее время у меня есть 50 сообщений в базе данных, но запрос возвращает все строки для каждого сообщения, более 1 строки для каждого сообщения, которое есть. Я думал, что отдельный post_id покажет только один раз? Что мне здесь не хватает?

Я бы предпочел, чтобы кто-нибудь сказал мне, как это сделать с помощью построителя запросов. Поскольку для этого потребуется много поиска в разных столбцах, и я хочу, чтобы это было как можно быстрее.

Это более простая версия -

 $query = DB::table('posts')
                ->select('posts.*','postimages.postimage_thumbnail')
                ->join('postimages', 'postimages.post_id', '=', 'posts.post_id')
                ->groupBy('posts.post_id');


        echo $query->count();
        exit();

Странно то, что SQL-запрос, который показывает laravel "select _3 _. *, _4 _._ 5_ from posts internal join postimages on _8 _._ 9_ = _10 _._ 11_ group by _12 _._ 13_", отлично работает в mysql


person shababhsiddique    schedule 03.04.2018    source источник
comment
Какую postimages строку вы хотите получить? Тот, у которого самый низкий id?   -  person Jonas Staudenmeir    schedule 04.04.2018
comment
это было бы лучше всего.   -  person shababhsiddique    schedule 04.04.2018
comment
прежде, чем кто-то напишет красноречивый способ, у меня это работает прямо сейчас, но важно, чтобы это был конструктор запросов.   -  person shababhsiddique    schedule 04.04.2018


Ответы (1)


Вы должны использовать groupby

Попробуйте этот код

 $query = DB::table('posts')
            ->select('posts.*',
                    'subcategories.subcategory_title_en',
                    'subcategories.subcategory_title_bn',
                    'categories.category_title_en',
                    'categories.category_title_bn',
                    'users.*',
                    'postimages.postimage_thumbnail'
                    )
            ->join('subcategories', 'subcategories.subcategory_id', '=', 'posts.subcategory_id')
            ->join('categories', 'categories.category_id', '=', 'subcategories.parent_category_id')
            ->join('users', 'users.id', '=', 'posts.user_id')
            ->join('postimages', 'postimages.post_id', '=', 'posts.post_id')->groupBy('posts.post_id');

В config / database.php в "mysql" измените: 'strict' => true, на false

person afsal c    schedule 03.04.2018
comment
какая-то странная ошибка - в нем говорится: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1055 'db_ibikri.posts.user_id' не входит в GROUP BY (.... - person shababhsiddique; 04.04.2018
comment
В config / database.php при изменении mysql: 'strict' = ›true, на false. Надеюсь, это поможет! - person afsal c; 04.04.2018
comment
Хорошо, теперь ошибка исчезла, но он выбирает все изображения post_id = 1, как мне сделать так, чтобы вместо этого он выбрал 1-й из всех post_ids? - person shababhsiddique; 04.04.2018
comment
Подождите, я думаю, что это исправило. Мне просто пришлось использовать groupBy ('postimages.post_id'), большое спасибо. Я застрял в этом так долго - person shababhsiddique; 04.04.2018
comment
Я отредактировал ответ, включив в него часть изменения mysql strict на false. Еще раз спасибо. - person shababhsiddique; 04.04.2018