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

Posted

技术标签:

【中文标题】Laravel Eloquent:如何从多个表中进行选择【英文标题】:Laravel Eloquent: How to select from multiple tables 【发布时间】:2017-08-22 15:08:44 【问题描述】:

我正在使用 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();

【问题讨论】:

你可以查看::***.com/questions/29165410/… 【参考方案1】:

您可以尝试您的建议,看看会发生什么。 你也可以做一些eager loading的关系

$house = House::with(["occupants","occupants.job"])->find($house_id);
foreach ($house->occupants as $occupant) 
     print_r($occupant->job);

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

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

现在细则:Laravel 将按照它找到它们的顺序包含“with”关系,并且还包含嵌套的所有中间关系,例如::with("occupants.job") 暗示 ::with(["occupants","occupants.job"]) 但是如果您已经设置了以前的关系,那么它会被维护(这就是它的工作原理)。设置occupants.job 时,occupants 不会被覆盖。

【讨论】:

此查询将加载所有数据,即使 active 不是 1。 @AlexeyMezenin 该死的,我错过了。 酷。另外,你不应该返回$query,它应该只是$query->....【参考方案2】:

此查询将加载所有带有active = 1 的占用者及其工作:

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

【讨论】:

【参考方案3】:

在 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')">
                                

【讨论】:

以上是关于Laravel Eloquent:如何从多个表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:如何从连接表中仅获取某些列

Laravel eloquent join 与三个表

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列

Laravel Eloquent 关系 - 将数据插入多个表

与多个中间表的多对多 Laravel Eloquent 关系

多个 Laravel Eloquent 关系未显示来自所有关系的数据