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关联的网站的连接数据。 但是,如果可能,我想在一个查询中了解如何执行此操作。
答案 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的集合时,您会发现可以使用它们替换大量查询。