Показывать только предметы, которых нет в других таблицах

Я хотел бы показать только школы, которые не пользуются популярностью.

чтобы получить любимые, я использую:

 $favorite_schools = DB::table('favorite_schools')
->select('favorite_schools.*', 'schools.name')
->leftJoin('schools', 'schools.id', 'favorite_schools.school_id')
->get();

Школьный стол:

Schema::create('schools', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('active');
$table->timestamps();
});

Таблица любимых школ:

 Schema::create('favorite_schools', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->integer('school_id');
$table->timestamps();
});

Как я могу получить только те школы, в которых еще нет привилегий?

1

Решение

Вам нужно пойти другим путем. Получите школы и оставьте соединение в таблице избранных, затем получите результаты, которые не дали результатов, в таблице любимых_школ.

$favorite_schools = DB::table('schools')
->select('schools.name', 'schools.id')
->leftJoin('favorite_schools', 'schools.id', 'favorite_schools.school_id')
->whereNull('favorite_schools.school_id')
->get();
1

Другие решения

добавлять WhereNull('favorite_schools.school_id') на запрос, который вы используете, чтобы получить любимые. это даст вам не любимые школы.

Удачи

0

немного другой подход будет использовать whereNotExists что должно быть быстрее, чем при использовании соединения

использование будет что-то вроде этого:

$schools = DB::table('schools')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('favorite_schools')
->whereRaw('favorite_schools.school_id = school.id');
})
->get();
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector