Храните только конкретный идентификатор Laravel - PullRequest
0 голосов
/ 04 мая 2018

у меня есть стол Foo

id

1 
2 
3 
4 
5

У меня есть стол Бар

foo_id = 1 test = 1
foo_id = 2 test = 0
foo_id = 4 test = 1
foo_id = 5 test = 1

Я хочу получить идентификатор из foo, где bar test = 0 или не существует в bar.

У меня есть

$id = Foo::with('bar')->whereHas('bar', function ($q)
  {$q->where('test', '=', 0)
  ->orWhereNull(foo_id???????);})
->get();

Как я могу записать это?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018
$id = Foo::with('bar')->whereHas('bar', function ($q)
  {
    $q->where('test', '=', 0)
      ->whereNotIn(
          'foo_id', DB::raw("SELECT foo_id FROM bar"), 'or'
      );
  })->get();
0 голосов
/ 07 мая 2018

Этот код отлично работает в соответствии с вашими потребностями.

$bars = DB::table('foos')
            ->Join('bars', function($join) {
              $join->on('foos.id', '=', 'bars.foo_id')
                  ->where('bars.test', '!=', '0');
            })
            ->select('foos.id');

  $result = DB::table('foos')
              ->leftJoin('bars', 'foos.id', '=', 'bars.foo_id')
              ->select('foos.id')
              ->whereNull('bars.foo_id')
              ->union($bars)
              ->get();
0 голосов
/ 04 мая 2018

Вы на правильном общем пути, но ваш whereHas не может найти в bar ничего, что не существует. Попробуйте этот подход вместо:

$id = Foo::with('bar')
    ->whereHas('bar', function ($q) {
        $q->where('test', '=', 0);
    }
    ->orWhereDoesntHave('bar')
    ->get();

Теперь вы ищете Foo, который имеет bar, где test равен 0, или который не имеет bar.

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