Laravel — возвращает только определенные столбцы внутри функции has

В настоящее время функция ниже работает правильно, однако ->has('alerts') возвращает весь массив alerts включая все данные об отношениях. Я хочу вернуть только определенные столбцы из этих отношений.

public function getMatches()
{
$matches = Criteria::select('id')
->has('alerts')
->with(['alerts.location' => function($w){
$w->select('id');
}])
->with('alerts.user.companies')
->where('user_id', Auth::id())
->get();

return Response::json(array(
'matches' => $matches,
'status' => '200'
)
);

}

Столбцы, которые я хотел бы вернуть, могут быть доступны в формате блейда (обратите внимание на стержень, который также используется):

@foreach($matches as $match)
@foreach($match->alerts as $alert)
{{$alert->pivot->criteria_id}}
{{$alert->pivot->alert_id}}
{{$alert->price_value}}
{{$alert->location->type}}
{{$alert->category}}
{{$alert->description}}
{{$alert->category}}
{{$alert->user->companies->first()->logo->url('thumb')}}
{{$alert->pivot->viewed}}
@endforeach
@endforeach

Я пробовал следующее:

public function getMatches()
{
$matches = Criteria::select('id')
->has(['alerts' => function ($q){
$q->select('id', 'pivot.criteria_id');
}])
->with(['alerts.location' => function($w){
$w->select('id');
}])
->with('alerts.user.companies')
->where('user_id', Auth::id())
->get();

}

Но я получил следующую ошибку:

strpos() expects parameter 1 to be string, array given

Ошибка возникает при добавлении следующей функции к has() функция:

->has(['alerts' => function ($q){
$q->select('id', 'pivot.criteria_id');
}])

Любая помощь в том, как я могу выбрать указанные поля из таблицы «оповещения» и соответствующие отношения, я был бы очень признателен.

0

Решение

Вы не хотите использовать has или же whereHas для этого. has Функции предназначены только для фильтрации результатов на основе отношения. Чтобы выбрать только определенные столбцы, используйте with()

$matches = Criteria::select('id')
->has('alerts')
->with(['alerts' => function($q){
$q->select('id', 'pivot.criteria_id');
}, 'alerts.location' => function($w){
$w->select('id');
}])
->with('alerts.user.companies')
->where('user_id', Auth::id())
->get();
0

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

В вашем коде у вас есть что-то вроде этого:

->has(['alerts' => function ($q){
//...
}])

Должно быть так:

->whereHas('alerts', function ($q){
//...
})
0

По вопросам рекламы [email protected]