Получить пользователей по возрасту, используя столбец даты рождения пользователя из таблицы

Кратко:

У меня есть столбец пользователя birthdate в моей таблице users. Дата рождения пользователя имеет формат даты по умолчанию: Y-m-d. Кроме того, у меня есть собственный мутатор для получения возраста пользователя в модели User.

Код мутатора:

public function getAgeAttribute($value) {
    if($this->birthday !== null) {
        $bday = new \DateTime("{$this->birthday}");
        $today = new \Datetime(date('Y-m-d'));
        $diff = $today->diff($bday);

        return $diff->y;
    }

    return null;
}

Вопрос:

Как я могу получить пользователей по возрасту, используя модель User?


person Andreas Hunter    schedule 29.10.2018    source источник
comment
что ты имеешь в виду by age ? Вы имеете в виду, что хотите получить всех пользователей старше 20 лет?   -  person hassan    schedule 29.10.2018
comment
Да, конечно @hassan   -  person Andreas Hunter    schedule 29.10.2018
comment
какой тип столбца? дата/время/дата?   -  person hassan    schedule 29.10.2018
comment
Строка типа столбца. Если вы думаете, что изменит тип поля на дату со строки, я изменю его. @хассан   -  person Andreas Hunter    schedule 29.10.2018
comment
вы можете использовать для этого локальную область.   -  person Wreigh    schedule 29.10.2018


Ответы (5)


Просто возьмите сегодняшнюю дату и вычтите количество лет. тогда сравните это с днями рождения

Users::where('birthday', '<=', date('Y-m-d', strtotime('-20 years')))->get();
person N69S    schedule 29.10.2018
comment
добавляя к этому ответу, эта логика может быть заключена в локальную область, определенную в модели пользователя. - person Wreigh; 29.10.2018

Если вы используете MySQL, есть и такая альтернатива:

 $users = User::whereDate('birthdate' , '<', \DB::raw("CURDATE()-INTERVAL 20 YEAR"))->get();
person apokryfos    schedule 29.10.2018

Мы также можем сделать это таким образом, мы увеличим еще один год и будем искать между датами, подобными этому.

$from = Carbon::today()->subYears($request->age);
$to = Carbon::today()->subYears(($request->age)+1);
$users->whereBetween('birth_date',[$to, $from]);`
person Ajay    schedule 21.09.2019
comment
я думаю, что это лучший подход - person Muhammad Inaam Munir; 05.03.2020

Вы можете использовать метод groupBy Collection для группировки пользователей по возрасту.

$users = User::all()->groupBy(function($user) {
             return $user->age;
         });

Затем вы можете получить всех пользователей для конкретного пользователя, как это.

$users->get(20);

Надеюсь, это то, что вы ищете.

person Nabin Paudyal    schedule 29.10.2018

я надеюсь, что это поможет вам, функция date() - это функция php, которая преобразует строку в дату и время.

$users = User::where('birthdate' , '<', date('Y-m-d', strtotime('your input field name')))->get();

person Naveed Ali    schedule 29.10.2018