Laravel изменить отношение, где предложение, если не строки возвращаются - PullRequest
0 голосов
/ 27 апреля 2018

У меня в контроллере следующий запрос.

$items = Item::with(['subitems' => function($query) {
    $query->where('language_id', '=', 1);
}])->get();

Правильно получаются все элементы, включая подпункты с идентификатором языка 1.

Есть две вещи, которые я хотел бы сделать с этим, хотя

  • Во-первых, мне нужно вернуть все подпункты, которые имеют отличное значение ref_id.
  • Во-вторых, я хотел бы отдать предпочтение идентификатору языка 1, но если его не существует, используйте любой идентификатор языка.

Так, например, я знаю, что этот код не будет работать, но я ищу следующее:

$items = Item::with(['subitems' => function($query) {
    $subItems = $query->where('language_id', '=', 1)
        ->where('ref_id', 'is', 'distinct');

    if($subItems->count() <= 0) {
      $subItems = $query->where('ref_id', 'is', 'distinct');
    }
}])->get();

Возможно ли это или это слишком сложно для Query Builder? Даже если бы один из двух запросов был возможен, это было бы здорово.

1 Ответ

0 голосов
/ 28 апреля 2018

Попробуйте это:

$items = Item::with(['subitems' => function($query) {
    $join = Subitem::select('ref_id', DB::raw('MIN(language_id) language_id'))
        ->groupBy('ref_id');
    $sql = '(' . $join->toSql() . ') subitems_distinct';
    $query->join(DB::raw($sql), function($join) {
        $join->on('subitems.ref_id', 'subitems_distinct.ref_id')
            ->on('subitems.language_id', 'subitems_distinct.language_id');
    });
}])->get();

Мы можем использовать тот факт, что предпочитаемый вами language_id является самым низким значением и выбрать минимальное.

...