簡體   English   中英

Laravel雄辯的ORM多對多搜索查詢

[英]Laravel Eloquent ORM many-to-many Search Query

我正在使用Laravel v3,Eloquent和該應用程序的MySQL數據庫

我有一個員工數據庫,其中有一個搜索表單,其中顯示了符合搜索條件的員工列表。 您可以填寫一個或多個字段,它將僅與所有填寫的字段匹配。 如下所示: http : //i.stack.imgur.com/Ttfhr.png

搜索所有功能正常,除了我剛剛為“培訓”添加了多選。 員工可以附加零到許多培訓證書。 如果用戶要搜索名字“ Matt”,並在培訓搜索條件下選中“ CSTS”,則該列表將顯示所有具有與Matt相似的名字的員工,並且也接受過CSTS培訓。

數據庫架構如下:

user
--id
--first_name
--last_name
--job_title_id
etc...


training
--id
--name
--issused_date
--expiry_date

user_training
--id
--user_id
--training_id

用戶模型和培訓模型如下:

class User extends Eloquent {

  public static $table = 'user';

  public function training(){
    return $this->has_many_and_belongs_to('training','user_training');
  }


class Training extends Eloquent {

    public static $table = 'training';


  public function users(){
      return $this->has_many_and_belongs_to('user','user_training');
  }



}

我有以下代碼用於函數搜索,以及我嘗試進行的培訓:

Route::post('(:bundle)/list', function() {

$search = new StdClass(); 
$search->first_name = Input::get('first_name');
$search->last_name = Input::get('last_name');
$search->job_titles = Input::get('job_titles'); // array of ids/returns null if none selected
$search->training = Input::get('training'); // array of ids/returns null if none selected
$search->city = Input::get('city');
$search->province = Input::get('province');
$search->phone = Input::get('phone');
$search->status = Input::get('status');
$search->gender = Input::get('gender');
$search->hire_from_date = Input::get('hire_from_date');
$search->hire_to_date = Input::get('hire_to_date');
$search->current_location = Input::get('current_location');
$search->role = Input::get('role');

Session::put('search', $search); // so we can access inside query builder sub-functions


$query = User::where('active', '=', true);

if(!empty($search->training)) { // one or many


    $query = User::with(array('training' => function($query) {
        $s_search = Session::get('search');
        //$query->where_in('training.id', $s_search->training);
        //foreach($s_search->training as $id) {
        //  $query->where('training.id', '=', $id);
        //}
    }));
}


//$query = User::join('user_training', 'user.id', '=', 'user_training.user_id');
//$query->join('user_training', 'user.id', '=', 'user_training.user_id');
//$query->join('training', 'training.id', '=', 'user_training.training_id');

if(!empty($search->first_name)) { $query->where('first_name', 'LIKE', '%' . $search->first_name . '%'); }
if(!empty($search->last_name)) { $query->where('last_name', 'LIKE', '%' . $search->last_name . '%'); }

if(!empty($search->city)) { $query->where('city', 'LIKE', '%' . $search->city . '%'); }
if(!empty($search->province)) { $query->where('province_id', '=', $search->province); }

if(!empty($search->gender)) { $query->where('gender', '=', $search->gender); }
if(!empty($search->phone)) { $query->where('phone_1', 'LIKE', '%' . $search->phone . '%'); }

if(!empty($search->status)) { $query->where('status_id', '=', $search->status); }
if(!empty($search->role)) { $query->where('role_id', '=', $search->role); }
if(!empty($search->current_location)) { $query->where('location_id', '=', $search->current_location); }

if(!empty($search->hire_from_date)) // "after"
    $query->where('hire_date', '>=', date('Y-m-d', strtotime($search->hire_from_date)));

if(!empty($search->hire_to_date))  // "before"
    $query->where('hire_date', '<=', date('Y-m-d', strtotime($search->hire_to_date)));

if(!empty($search->job_titles)) { // one or many
    $query->where(function($query){
        $s_search = Session::get('search');
        foreach($s_search->job_titles as $id) {
            $query->or_where('job_title_id', '=', $id);
        }
    });
}



$query->order_by('last_name');

$user_list = $query->distinct()->get();
$user_count = $query->count();

var_dump($user_list); die;


if(Input::get('action') == 'export') {

    if(Permission::check("Export Users CSV")) {
        $now = new DateTime();
        return Response::download(User::get_group_csv($user_list), date_format(new DateTime(), 'Y-m-d') . '_User_Export.csv');
    }

} 

“ $ user-> training”以簡單的id數組形式出現,它與Training-> id表匹配

多重選擇可以正確執行“職務標題”搜索,但是job_title_id在User表中,而不是關系中。

我試過循環,手動加入,使用急切的加載,使用Eloquent的“ with”,但都沒有成功。 有人可以指出我正確的方向嗎?

首先,您無需使用會話即可將變量獲取到匿名函數中。 嘗試改用“用途”。

// $search already defined

$query = User::where('active', '=', true);

if(!empty($search->training)) { // one or many
    $query = User::with(array('training' => function($query) uses ($search) {
        // Now you can use $search in this context
    }));
}

}

另外,您在關系中使用小寫字符串,但是模型/類實際上是大寫的,因此它們應該像這樣:

class User extends Eloquent {

    public static $table = 'user';

    public function training(){
        return $this->has_many_and_belongs_to('Training', 'user_training');
    }
}

class Training extends Eloquent {

    public static $table = 'training';

    public function users(){
        return $this->has_many_and_belongs_to('User', 'user_training');
    }
}

第三,您聲明“ $ query = User :: where('active','=',true);” 然后覆蓋它。 也許您正在尋找:

if (!empty($search->training)) { // one or many
    $query = User::with(array('training' => function($query) uses ($search) {
        // Now you can use $search in this context
        $query->where_in('training.id', $search->training);
    }));
} else {
    $query = User::with(array());
}
$query = $query->where('active', '=', true);

我可以提供更多的見解,但您的最終目標不是100%。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM