1

我正在尝试使用 eloquent 搜索两个可选表:

$users  = User::where('ProfileType', '=', 2)
                ->where(function($query) {
                    $query->where('BandName', 'LIKE', "%$artist%");
                    $query->or_where('Genre', 'LIKE', "%$genre%");
                })->get();

当用户进行空搜索时,这适用于返回所有结果,但我不确定如何调整它以在存在时搜索乐队名,反之亦然。

4

4 回答 4

10

只是为了解释下面的答案会发生什么:

Eloquent 在这里做了一件棘手的事情:当你调用User::where(...)它时,它会返回一个Database\Query对象。DB::table('users')->where(...)这与构造 SQL 查询的可链接对象基本相同。

所以有:

// Instantiates a Query object
$query = User::where('ProfileType', '=', '2');
$query->where(function($query) {
    // Adds a clause to the query
    if ($artist = Input::get('artist')) {
        $query->where_nested('BandName', 'LIKE', "%$artist%", 'OR');
    }
    // And another
    if ($genre = Input::get('genre')) {
        $query->where_nested('Genre', 'LIKE', "%$genre%", 'OR');
    }
});

// Executes the query and fetches it's results
$users = $query->get();
于 2013-03-06T18:14:11.813 回答
2

建立在维尼修斯的回答的基础上,这就是有效的:

// Instantiates a Query object
$query = User::where('ProfileType', '=', '2');

// Adds a clause to the query
if ($artist = Input::get('artist')) {
    $query->where('BandName', 'LIKE', "%$artist%");
    // Temp Usernamesearch
    $query->or_where('NickName', 'LIKE', "%$artist%");
}

// Genre - switch function if artist is not empty
if ($genre = Input::get('genre')) {
    $func = ($artist) ? 'or_where' : 'where';
    $query->$func('Genre', 'LIKE', "%$genre%");
}

// Executes the query and fetches it's results
$users = $query->get();

事实证明,只有在未设置 $artist 时,第二个可选字段才必须使用 or_where。

谢谢你的帮助

于 2013-03-06T20:29:30.583 回答
1

我想这就是你所追求的。您的视图将有一个表单来搜索艺术家/流派,可以设置一个或另一个,或者两者都设置,或者不设置。

$users = User::where('ProfileType', '=', 2);

if (Input::has('artist')) {
    $users = $users->where('BandName', 'LIKE', '%'.Input::get('artist').'%');
}

if (Input::has('genre')) {
    $users = $users->where('Genre', 'LIKE', '%'.Input::get('genre').'%');
}

$users = $users->get();
于 2013-03-05T21:50:52.097 回答
0
$query = FormEntry::with('form')->where('domain_id', $id);

$query->where(function($query) use ($search, $start, $limit, $order, $dir) {                
     $query->where('first_name', 'LIKE', "%{$search}%")
           ->orWhere('last_name', 'LIKE', "%{$search}%")
           ->orWhere('email', 'LIKE', "%{$search}%")
           ->offset($start)
           ->limit($limit)
           ->orderBy($order, $dir);
      });

$entries = $query->get();
$totalFiltered = $query->count();
于 2021-09-02T12:35:49.713 回答