Вот упрощенная версия моего кода:
Вот упрощенная версия моего кода:
Вот упрощенная версия моего кода:
р>
Код: Выделить всё
public function index(Request $request): JsonResponse
{
$user = User::find(auth()->id());
// ... other request handling code
$titlesQuery = Title::with(['practices', 'quizzes', 'contests']);
if (!$user->is_accepted) {
$titlesQuery->whereHas('practices')
->whereDoesntHave('quizzes')
->whereDoesntHave('contests');
}
// Additional filters and search terms
return $titlesQuery->paginate($limit);
}
Проблема, с которой я столкнулся, заключается в том, что когда я запускаю этот запрос, любой заголовок, содержащий тест (даже если у него тоже есть практика) полностью исключается из результата. Я хочу исключать заголовки с викторинами или конкурсами только в том случае, если в них нет каких-либо практик, и возвращать только те практики, где это необходимо.
Пример сценария
Например, если у меня есть следующие записи:
В разделе А есть и практика, и викторина.
Раздел Б содержит только практику.
В разделе C есть викторина.
В титуле C есть соревнование.
Я хочу, чтобы мой запрос вернул:
Заголовок A (должен вернуть практику и исключить тест)
Раздел B (следует включать)
Раздел C (не следует включать, поскольку это викторина)
Раздел D (не следует включать, поскольку он конкурс)
Дополнительная информация
Моя модель Title имеет отношения, определенные с помощью практик, викторин и конкурсы.
Я хочу сохранить другие фильтры (например, поиск, категорию и подкатегорию), которые я применяю позже в запросе.
Мои отношения с моделью:
Код: Выделить всё
//Title:
public function quizzes()
{
return $this->hasMany(Quiz::class);
}
public function practices()
{
return $this->hasMany(Practice::class);
}
public function contests()
{
return $this->hasMany(Contest::class);
}
Код: Выделить всё
//Quiz, Practice, Contest
public function title()
{
return $this->belongsTo(Title::class);
}
Я пытался реструктурировать свой запрос, чтобы сначала использоватьwhereHas для практик, а затем –whereDoesntHave для викторин и конкурсов, но он по-прежнему исключает заголовки, в которых есть тесты, хотя я хочу исключить их только тогда, когда у них нет практик.
Я ТАКЖЕ ПОПЫТАЛСЯ ЗАПУСТИТЬ ПОДЗАПРОС, ТАК:
Код: Выделить всё
$titlesQuery->whereHas('practices')
->where(function ($query) {
// Exclude titles that have quizzes or contests
$query->whereDoesntHave('quizzes')
->whereDoesntHave('contests');
});
Подробнее здесь: https://stackoverflow.com/questions/791 ... uding-thos