На ум приходят три пути:
1 - объединение четырех разных таблиц.для этого я предлагаю вам сначала получить все цели по отдельности и перемешать их, вы также можете использовать запрос RANDOm, но это очень медленная команда запроса.
$fourPurposes =Question::select('purpose')->get()->shuffle()->flatten()->unique();
$unions = Question::query();
for(%i=0;$i<4;$i++){
$query = Question::where('prupose', $fourPurposes[$i])->limit(11);
$unions = $unions->union($query);
}
$questions = $unions->get();
2 - это сложно, но если выу меня есть очень большие таблицы и индексированные столбцы назначения, я думаю, что это будет лучше.В этом методе вы объединяете таблицу вопросов с другой таблицей вопросов.В одном вы ограничиваете цель, в другом вы ограничиваете количество вопросов.Запрос должен быть примерно таким.(Я действительно не уверен в этом, я надеюсь, что мы можем отредактировать это, чтобы сделать его лучше)
$table1 = DB::table('questions')->groupBy('purpose')->limit(4);
$questions = DB::table('questions as q1)
->join(Db::raw('
(select * from questions as q2 limit 11)
'), function($join){
$join->on('q1.purpose','=','q2.purpose');
})->limit(44)->get();
3- Я думаю, что этот метод вообще лучший.Если у вас нет массивного стола, используйте этот.Это намного проще и проще.В этом методе у вас просто есть четыре разных запроса.Это очень похоже на первый метод, но проще.
$fourPurposes =Question::select('purpose')->get()->shuffle()->flatten()->unique();
$questions = new Collection();
for(%i=0;$i<4;$i++){
$query = Question::where('prupose', $fourPurposes[$i])->limit(11)->get();
$questions = $questions->union($query);
}