Laravel QueryBuilder где предложение с пользовательской информацией о другой модели - PullRequest
0 голосов
/ 30 января 2019

У меня есть Model ImageRequest, который связан с моей моделью пользователя, например:

public function user()
{
    return $this->belongsTo('App\User');
}

Моя модель пользователя выглядит следующим образом:

public function imageRequests()
{
    return $this->hasMany('App\ImageRequest');
}

Теперь я использую этот пакет для сборкимой фильтруемый запрос для извлечения всех ImageRequests:

spatie / laravel-query-builder

вот так выглядит мой запрос:

$query = QueryBuilder::for(ImageRequest::class)
        ->with(['requestTypes'])
        ->allowedIncludes('requestTypes')
        ->orderByRaw("FIELD(status , 'new') desc")
        ->orderBy('functional_id', 'asc')
        ->allowedFilters(
            'id',
            'pv_number',
            'created_at',
            Filter::scope('starts_between'),
            'location_of_facts',
            'train_nr',
            'status',
            'result_of_search',
            Filter::custom('type', RequestTypeFilter::class)
);

Мне нужно добавить предложение where для модели User что-то вроде этого:

->where('zone', Auth::user->zone);

Но там написано:

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'зона 'in' where clause '(SQL: выберите количество (*) в качестве агрегата из image_requests, где zone = a)

1 Ответ

0 голосов
/ 30 января 2019

Пожалуйста, посмотрите в этот код, здесь я добавил whereHas вместо где.поэтому он будет принимать только совпадающие записи в пользовательской таблице для нужной зоны.

надеюсь, это поможет ..

$query = QueryBuilder::for(ImageRequest::class)
     ->with(['requestTypes'])
     ->whereHas('user'=>function($q){
         $q->where('zone', Auth::user->zone);
      })
      ->allowedIncludes('requestTypes')
      ->orderByRaw("FIELD(status , 'new') desc")
      ->orderBy('functional_id', 'asc')
      ->allowedFilters(
         'id',
         'pv_number',
         'created_at',
          Filter::scope('starts_between'),
          'location_of_facts',
          'train_nr',
          'status',
          'result_of_search',
           Filter::custom('type', RequestTypeFilter::class));

Пожалуйста, попробуйте это, использовал запрос прямого соединения.

$query = ImageRequest::selectRaw('column1,column2') 
        ->join('user', function($join){
            $join->on('ImageRequest.user_id','=','user.id');
        })
        ->leftJoin('request_types', function($join){
            $join->on('request_types.image_request_id','=','image_request.id')
        })
        ->where('user.zone', Auth::user->zone)
        ->orderByRaw("FIELD(status , 'new') desc")
        ->orderBy('functional_id', 'asc')
        ->allowedFilters(
                'id',
                'pv_number',
                'created_at',
                Filter::scope('starts_between'),
                'location_of_facts',
                'train_nr',
                'status',
                'result_of_search',
                Filter::custom('type', RequestTypeFilter::class)
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...