Laravel - 仅返回has函数中的某些列

时间:2015-02-09 19:15:23

标签: php laravel laravel-4 eloquent pivot-table

目前,下面的函数可以正常工作,但->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');
}])

有关如何从“提醒”表格中选择所述字段的任何帮助以及我非常感谢的相应关系。

2 个答案:

答案 0 :(得分:1)

在你的代码中你有这样的东西:

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

应该是这样的:

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

答案 1 :(得分:0)

您不希望使用haswhereHashas函数仅用于根据关系过滤结果。要仅选择某些列,请使用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();