2015-09-11 60 views
0

我遇到了一個我不知道如何解決的問題。 我有公司有一個配置文件(配置文件屬於公司),並有地點(公司有很多地點)。Laravel 5.1 - 查詢多個關係

我試圖讓它們具有像$request->input('search_term')一個名字,並有至少一個位置與郵政編碼或城市配套$request->input('search_addition')和配置文件與類型0

我的代碼全部公司是:

$companies = Company::with(['profile' => function ($query) { 
        $query->where('type', 0); 

       }]) 
       ->whereHas('locations', function ($query) use ($request) { 
        $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
          ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
       }) 
       ->where('name', 'like', '%'.$request->input('search_term').'%'); 

最後我補充$companies = $companies->paginate(25);

結果我得到的是不是我想要的。我獲得了所有名稱爲$request->input('search_term')的公司。它忽略配置文件的類型和位置。對於那些與指定的search_addition不匹配的公司,locations數組是空的,但它仍然會返回公司。

回答

0

with()用於加載或不加約束的關係,不用作約束來過濾父模型,您需要使用where函數族代替。

這是我認爲代碼應該(未測試)。

$companies = Company::with('profile') 
    ->with(['locations' => function ($query) use ($request) { 
     $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
      ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
    }]) 
    ->whereHas('profile', function ($query) { 
     $query->where('type', 0); 
    }) 
    ->whereHas('locations', function ($query) use ($request) { 
     $query->where('zip', 'like', '%'.$request->input('search_addition').'%') 
      ->orWhere('city', 'like', '%'.$request->input('search_addition').'%'); 
    }) 
    ->where('name', 'like', '%'.$request->input('search_term').'%'); 
+0

這不起作用。回到繪圖板我猜。雖然你對「與」的暗示很好。也許我可以用這種方式解決問題。 –