Laravel 5.2将查询从控制器移动到模型

时间:2016-03-30 21:48:22

标签: php mysql laravel

嗨所以我对搜索表单有这么大的查询,而我只是想知道如何将其移到模型中,我已经阅读了查询范围等等但这比仅仅复杂得多在1个桌子上搜索1个字段,我很丢失,任何帮助表示赞赏!

public function index()
{
    $input = Request::all();
    $date = \Carbon\Carbon::now()->subMinute(30);
    $query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id');

    if (isset($input ['minAge']) && $input['minAge']) {
        $minAge = $input['minAge'];
        $maxDate = \Carbon\Carbon::today()->subYears($minAge)->endOfDay();
    }

    if (isset($input ['maxAge']) && $input['maxAge']) {
        if ($input['maxAge'] < $input['minAge']) {
            $maxAge = $input['minAge'];
        }
        else {
            $maxAge = $input['maxAge'];
        }
        $minDate = \Carbon\Carbon::today()->subYears($maxAge + 1);
    }

    if (isset($input['u']) && $input['u'])
        $query->where('users.username', '=', $input['u']);
    if (isset($input['p'])  && $input['p'])
        $query->where('user_profiles.postcode', '=', $input ['p']);
    if (isset($input['o1']) && $input['o1'])
        $query->where('users.last_online','>=',$date);
    if (isset($input['o2']) && $input['o2'])
        $query->whereNotNull('user_profiles.avatar');
    if (isset($input ['o3']) && $input['o3'])
        $query->orderBy('users.type', 'ASC');
    if (isset($input ['minAge']) && $input['minAge'])
        $query->whereBetween('user_profiles.dob', [$minDate, $maxDate]);
    if (isset($input ['g']))
        $query->whereIn('user_profiles.gender',$input ['g']);

    $query->orderBy('users.last_online', 'DESC');
    $users = $query->paginate(1);
    return view('view', compact('users'));
}

1 个答案:

答案 0 :(得分:1)

你可以这样做。在用户模型的函数中接受$ input作为参数。

在用户模型中,添加以下代码。

public static function allUsers($input)
{
    $date = \Carbon\Carbon::now()->subMinute(30);
    $query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id');

    if (isset($input ['minAge']) && $input['minAge']) {
        $minAge = $input['minAge'];
        $maxDate = \Carbon\Carbon::today()->subYears($minAge)->endOfDay();
    }

    if (isset($input ['maxAge']) && $input['maxAge']) {
        if ($input['maxAge'] < $input['minAge']) {
            $maxAge = $input['minAge'];
        }
        else {
            $maxAge = $input['maxAge'];
        }
        $minDate = \Carbon\Carbon::today()->subYears($maxAge + 1);
    }

    if (isset($input['u']) && $input['u'])
        $query->where('users.username', '=', $input['u']);
    if (isset($input['p'])  && $input['p'])
        $query->where('user_profiles.postcode', '=', $input ['p']);
    if (isset($input['o1']) && $input['o1'])
        $query->where('users.last_online','>=',$date);
    if (isset($input['o2']) && $input['o2'])
        $query->whereNotNull('user_profiles.avatar');
    if (isset($input ['o3']) && $input['o3'])
        $query->orderBy('users.type', 'ASC');
    if (isset($input ['minAge']) && $input['minAge'])
        $query->whereBetween('user_profiles.dob', [$minDate, $maxDate]);
    if (isset($input ['g']))
        $query->whereIn('user_profiles.gender',$input ['g']);

    $query->orderBy('users.last_online', 'DESC');
    $users = $query->paginate(1);
    return $users;
}

然后在您的Controller中,只需更新以下内容。

使用静态

public function index()
{
    $users = User::allUsers(Request::all());
    return view('view', compact('users'));
}

可替换地,

public function index()
{

    $user = new User;
    $user->allUsers(Request::all());
    return view('view', compact('users'));
}

以这种方式完成后,您可以轻松地开始使用较小的范围。要使用示例范围,您可以查看此Laravel. Use scope() in models with relation

让我知道它是否适合你。