2014-07-11 113 views
0

我有一個工作模型,可以有很多產品。Laravel用hasMany搜索

Job.php 
class Job extends Eloquent 
{ 
    .... 
    public function products() 
    { 
     return $this->hasMany('Products'); 
    } 
    .... 
} 

現在我希望用戶能夠按產品搜索工作。 形式來搜索產品:

job.search.blade.php 
.... 
<div class="form-group required has-feedback products displayed"> 
    {{ Form::label('product_id', 'Product', array('class' => 'control-label')) }} 
    {{ Form::select('product_id', Product::product_select(), Input::old('product_id'), array('class' => 'form-control', 'required' => 'required')) }} 
    <span id="add_product_button" class="glyphicon glyphicon-plus-sign form-control-feedback"></span> 
</div> 
<div class="form-group products hidden"> 
    {{ Form::label('product_id_2', 'Product #2', array('class' => 'control-label')) }} 
    {{ Form::select('product_id_2', Product::product_select(), Input::old('product_id_2'), array('class' => 'form-control', 'required' => 'required')) }} 
</div> 
<div class="form-group products hidden"> 
    {{ Form::label('product_id_3', 'Product #3', array('class' => 'control-label')) }} 
    {{ Form::select('product_id_3', Product::product_select(), Input::old('product_id_3'), array('class' => 'form-control', 'required' => 'required')) }} 
</div> 
<div class="form-group products hidden"> 
    {{ Form::label('product_id_4', 'Product #4', array('class' => 'control-label')) }} 
    {{ Form::select('product_id_4', Product::product_select(), Input::old('product_id_4'), array('class' => 'form-control', 'required' => 'required')) }} 
</div> 
<div class="form-group products hidden"> 
    {{ Form::label('product_id_5', 'Product #5', array('class' => 'control-label')) }} 
    {{ Form::select('product_id_5', Product::product_select(), Input::old('product_id_5'), array('class' => 'form-control', 'required' => 'required')) }} 
</div> 
.... 

在JobController,用實例化的變量:

$query = Job::orderBy('job_id', 'DESC'); 

我怎樣才能對用戶有規定的產品?

我的嘗試越來越接近,但我一直堅持了一段時間。

JobController.php 
.... 
if (Input::has('product_id') && Input::get('product_id') != 0) 
{ 
    $query->with(array('products' => function($products) 
    { 
     $products->where('product_id', '=', Input::get('product_id')); 
    })); 
} 
$jobs = $query->paginate(15); 
.... 

編輯:解決

我顯然不能用「與」搜索,所以我不得不使用SQL連接。 http://forumsarchive.laravel.io/viewtopic.php?id=13238

因此,對於具有的hasMany搜索(),

if (Input::has('product_id') && Input::get('product_id') != 0) 
{ 
    $query->where('inventory.product_id', '=', Input::get('product_id')); 
} 

if (Input::has('product_id_2') && Input::get('product_id_2') != 0) 
{ 
    $query->leftJoin('inventory AS inventory_2', 'inventory_2.job_id', '=', 'jobs.id'); 
    $query->where('inventory_2.product_id', '=', Input::get('product_id_2')); 
} 

if (Input::has('product_id_3') && Input::get('product_id_3') != 0) 
{ 
    $query->leftJoin('inventory AS inventory_3', 'inventory_3.job_id', '=', 'jobs.id'); 
    $query->where('inventory_3.product_id', '=', Input::get('product_id_3')); 
} 

if (Input::has('product_id_4') && Input::get('product_id_4') != 0) 
{ 
    $query->leftJoin('inventory AS inventory_4', 'inventory_4.job_id', '=', 'jobs.id'); 
    $query->where('inventory_4.product_id', '=', Input::get('product_id_4')); 
} 

if (Input::has('product_id_5') && Input::get('product_id_5') != 0) 
{ 
    $query->leftJoin('inventory AS inventory_5', 'inventory_5.job_id', '=', 'jobs.id'); 
    $query->where('inventory_5.product_id', '=', Input::get('product_id_5')); 
} 

如果有人可以給我推薦一種有效的方式這樣做,請讓我知道。

謝謝。

+0

你想檢索什麼結果? –

+0

@deczo假設有一個工作#1有三種產品:A,B和C.還有另一個工作#2有兩種產品,A和B.現在,他們想要搜索帶有產品的工作; A,B,C。這樣只有Job#1會出現。 – Raza

+0

然後你需要'whereIn'和'count'。這正是你所需要的:http://stackoverflow.com/questions/24704119/laravel-tag-search-to-return-images-that-c​​ontain-all-tags#answer-24706347 –

回答

2
$products; // array of ids from the form 

$jobs = Job::whereHas('products', function ($q) use ($products) { 
    $q->whereIn('products.id', $products); 
}, '=', count($products))->get(); 
1

使用whereIn方法:

$query->with(array('products' => function($query) 
{ 
    $productIds = Input::only('product_id', 'product_id_2', 'product_id_3'); 

    $query->whereIn('product_id', $productIds); 
})); 

你應該使用的產品ID的陣列,而不是他們的編號,但是這是另一天的討論。

+0

快速的問題:有什麼區別'在哪裏'vs上例中的whereId?不會'whereId($ productIds)'做同樣的事情? – Kousha

+0

@JosephSilber謝謝,我將使用數組而不是product_id_n來表示多個產品。我完全忘記了通過HTML表單發送數組。 – Raza

+0

@Kousha - Nope。 'whereId($ foo)'相當於'where('id','=',$ foo)' –