Laravel Eloquent:如何从多个表中进行选择

时间:2017-03-29 08:28:51

标签: php laravel eloquent

我使用Laravel和它提供的Eloquent ORM,但我很难选择我需要的数据。我有3个模特

  • 乘员
  • 工作

房子可以有多个住户,我可以使用以下方法轻松获得这些房产。

$house= House::find($house_id);
$occupants = $house->occupants()->where('active', 1)->get();

这很好用但我也想选择每个乘员的工作。我把它作为一对一的关系,但工作是在一个单独的表中。

是否有办法有效地从作业表中为每个占用者选择相关作业?我猜它会是这样的

$occupants_and_jobs = $house->occupants()->where('active', 1)->job()->get();

3 个答案:

答案 0 :(得分:2)

您可以尝试一下您的建议,看看会发生什么。 您还可以执行一些eager loading关系

$house = House::with(["occupants" => function ($query) { 
    $query->where("active","=",1); 
},"occupants.job"])->find($house_id);
foreach ($house->occupants as $occupant) {
    print_r($occupant->job);
}

作为@AlexeyMezenin如果您需要约束关系,那么您需要(如约束Eager Loads 下的docs建议):

::with("occupants.job")

现在的精美印刷品:Laravel将包括"与"它找到它们的顺序中的关系,并且还包括嵌套的所有中间关系,例如, ::with(["occupants","occupants.job"])隐含occupants但是如果您已经设置了先前的关系,那么它就会被维护(这是如何工作的)。设置occupants.job时,不会覆盖 TextWatcher watch = new TextWatcher(){ @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int a, int b, int c) { // TODO Auto-generated method stub output.setText(s); if(a == 9){ Toast.makeText(getApplicationContext(), "Maximum Limit Reached", Toast.LENGTH_SHORT).show(); } }};

答案 1 :(得分:1)

此查询将为所有占有者加载active = 1及其作业:

House::with(['occupants' => function($q) {
    $q->where('active', 1);
}, 'occupants.job'])->find($house_id);

答案 2 :(得分:0)

从laravel中的不同表中搜索数据的完整方法:

路线:

Route::get('/systems/search', 'SearchController@search')->name('project-search');

在searchController中尝试这种方式:

 public function search(Request $request)
    {
        $data = DB::table('projects as p')->select('p.*','u.first_name', 'u.last_name')
        ->join('users as u','p.user_id','=','u.id');
        if( $request->input('search')){
            $data = $data->where('p.title', 'LIKE', "%" . $request->search . "%")
            ->orWhere('p.description', 'LIKE', "%" . $request->search . "%")
            ->orWhere('u.first_name', 'LIKE', "%" . $request->search . "%")
            ->orderBy('p.created_at', 'desc');
        }
        $data = $data->paginate(16);
        return view('systems.search', compact('data'));
      
    }

以这种方式在刀片中接收这些数据:

<div class="col-md-8">
<h3>List of Results</h3>
<table class="table table-striped">
<tr>
<th>title</th>
<th>description</th>
<th>creator</th>
<th>category</th>
</tr>

@foreach($data as $search)
<tr>
<td>{{ $search->title }}</td>
<td>{{ $search->description }}</td>
<td>{{ $search->first_name }}</td>
</tr>
@endforeach
</table>
{{ $data->appends(request()->except('page'))->links() }}
</div>

搜索框输入字段:

<div class="input-group input_search" style="width: 100%">
                                    <input style="border-radius: 20px" type="text" class="form-control search"
                                        placeholder="Search" aria-describedby="basic-addon2" name="search" id="search"
                                        value="{{Request::get('title')}}">