在Laravel查询生成器或SQL

时间:2018-03-16 19:40:19

标签: php sql laravel laravel-5

SQL查询不是我的强项之一,我遇到了一个我能够解决但我希望能够提高并提高效率的问题。我在这些示例中使用了Laravel的查询生成器,但如果必须,请不要介意使用原始请求。

目前我正在进行如下两个查询并将它们合并。

 $acc_id = 10;
 $locat_id= 3;  

//First get all sites with account id
$allSites = collect(DB::table('sites')->where('acc_id', $acc_id)->get()):

//Next get only sites with account id and connections with current location id
$connectedSites = collect( 
    DB::table('sites')
        ->select('sites.id','name','active','url')
        ->join('connections as conn','sites.id','=','conn.site_id')
        ->where('acc_id',$acc_id)
        ->where('conn.locat_id',$locat_id)
        ->get()
);

//Merge the collections and drop first row with duplicate site_id
$sites = $allSites->merge($connectedSites)->keyBy('id');

return $sites;

所以这给了我想要的结果。例如。与帐户ID关联的所有网站,以及与帐户和位置ID关联的网站的连接数据。 但是,如果可能,我想在一个查询中了解如何执行此操作。

2 个答案:

答案 0 :(得分:2)

尝试LEFT JOIN:

$sites = DB::table('sites')
    ->select('sites.*','name','active','url')
    ->leftJoin('connections as conn', function($query) use($locat_id) {
        $query->on('sites.id', '=', 'conn.site_id')
            ->where('conn.locat_id', $locat_id);
    })
    ->where('acc_id',$acc_id)
    ->get();

答案 1 :(得分:0)

这可以通过一个查询完成,但我使用eloquent而不是查询构建器。检查with()方法,它允许您急切加载关系。

$sites = Sites::with('connections')->where('acc_id', $acc_id)->get();

现在,您可以从模型实例访问连接数据,而无需再进行任何查询。

foreach($sites as $site){
    $site->connection->stuff; // No query generated
}

如果你需要将两者分开也很容易。

$connectedSites = $sites->where('connection.locat_id', $locat_id)
// No query generated from the above, but now $connectedSites has all of
// the connected sites

当您进入laravel的集合时,您会发现可以使用它们替换大量查询。

https://laravel.com/docs/5.6/collections#available-methods