Laravel Eloquent: исключение заголовков с викторинами или конкурсами, но включение заголовков с практикамиPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Laravel Eloquent: исключение заголовков с викторинами или конкурсами, но включение заголовков с практиками

Сообщение Anonymous »

Я работаю над приложением Laravel, и мне нужна помощь с фильтрацией заголовков на основе их связи с практиками, викторинами и конкурсами. В частности, я хочу получить названия, которые связаны с практиками, но не имеют связанных с ними викторин или конкурсов. Однако я столкнулся с проблемой, из-за которой из набора результатов исключаются заголовки, содержащие как практики, так и викторины (или конкурсы).
Вот упрощенная версия моего кода:
Вот упрощенная версия моего кода:
Вот упрощенная версия моего кода:
р>

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»