Как исключить из модели те элементы, id которых есть в другой модели?

Есть две модели - A и B. У них связь один ко многим - у модели В может быть много элементов с id модели A. Нужно создать объект, который будет содержать все те элементы модели А, id которых не будет в В.

Пробовал получить массивы id и сделать array_diff, но мне нужны все данные из a, не только id:

$a= DB::table('a')->where('id', '>', 0)->pluck('id')->toArray();
$b = DB::table('b')->where('a_id', '>', 0)->pluck('a_id')->toArray();
$all = array_diff($a, $b);

Это также не работает - "у массива нет свойства id":

$a = A::all();
$a = $a->toArray();
$b = B::all();
$b = $b->toArray();
$diff = array_udiff(
    $a,
    $b,
    function ($a_el, $b_el) {
        return $a_el->id == $b_el->id;
    }
);

Ответы (1 шт):

Автор решения: KordDEM

Попробую по-ванговать, видимо таблица В не нормализована.

1 вариант

$b = DB::table('b')->where('a_id', '>', 0)->pluck('a_id')->toArray(); // тут еще
можно на уникальность проверить ->groupBy('a_id')->pluck('a_id')->toArray();
$a= DB::table('a')->whereNotIn('id', $b)->get(); // выбираем те записи из
таблицы А, id которых нет в массиве $b

2 вариант

$a = DB::table('a')->leftJoin('b', 'a.id', '=', 'b.a_id')->whereNull('b.id')->groupBy('a.id')->get();
→ Ссылка