复杂查询Laravel

时间:2017-03-31 10:07:25

标签: php laravel query-builder

嗨,我有一个复杂的查询

SELECT distinct libelle_adresse from adresse 
where id_adresse in (select id_adresse from zone_adresse 
where fk_zone in (select id_zone from zone 
where id_arrondissement in (select id_arrondissement from arrondissement
where libelle_arrondissement="'.$_GET['arrondis'].'")))

我已经使用$arrondis = $request->input('arrondis');来获取" arrondis"来自URL的参数并将其传递给我的控制器。

这是我的尝试

    $term = $request->term;

    $arrondis = $request->input('arrondis');

    $query1 = DB::table('arrondissement')
    ->select('id_arrondissement')
    ->where('libelle_arrondissement','=',$arrondis)
    ->get();

    $query2 = DB::table('zone');
    ->select('id_zone')
    ->where('id_arrondissement','=',$query1)
    ->get();

    $query3 = DB::table('zone_adresse');
    ->select('id_adresse')
    ->where('fk_zone','=',$query2)
    ->get();

    $queries = DB::table('adresse');
    ->where('id_adresse','=',$query3)
    ->where('libelle_adresse','like','%'.$term.'%')
    ->take(3)->get();
    foreach ($queries as $query)
    {
        $results[] = ['id' => $query->id_adresse, 'value' => $query->libelle_adresse]; 
    }
    return response()->json($results);

我知道当我通过"查询(1/2/3)变量时,我得到错误"在"其中"但我无法找到任何解决方案

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

我认为您展示的查询是否比您需要的要复杂得多。

SELECT distinct libelle_adresse 
FROM adresse as a
INNER JOIN zone_address as za ON a.id_adresse = za.id_adress
INNER JOIN zone as z ON za.fk_zone = z.id_zone
INNER JOIN arrondissement as arr ON arr.id_arrondissement = z.id_arrondissement
Where libelle_arrondissement="'.$_GET['arrondis'].'")))

由于我没有表结构细节,我可能在我在场前使用的标签中犯了错误。但是这个请求也是这样做的,并且更容易处理。

因为关于laravel join的文档很充实。我希望这足以帮助你。

答案 1 :(得分:0)

试试这个

DB::table("adresse")
    ->whereIn("id_adresse", DB::table("zone_adresse")
       ->whereIn("fk_zone", DB::table("zone")
         ->whereIn("id_arrondissement", DB::table("arrondissement")
           ->where("libelle_arrondissement","=", $_GET['arrondis'])
           ->pluck("id_arrondissement")->toArray()
        )
         ->pluck("id_zone")->toArray()
    )->pluck("id_adresse")->toArray())
    ->distinct()
    ->select("libelle_adresse as value, id_adresse as id")
    ->where('libelle_adresse', 'like', '%'.$term.'%') 
    ->get();

这有助于您将所有查询合并为一个。但这看起来很丑陋(虽然会解决问题)。我建议最好使用 Eloquent