Среднее значение Laravel для аксессуара

Мне нужно рассчитать средний возраст пользователя.

вот мой код доступа

public function getAgeAttribute()
{
    if ($this->birthday)
        return Carbon::parse($this->birthday)->age;
    else
        return 'Unknown';
}

Как я могу рассчитать средний возраст по аксессуару? Спасибо за любую помощь ..


person BlackLotus    schedule 24.04.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как рассчитать средний возраст пользователей используя даты своего рождения   -  person Clément Baconnier    schedule 24.04.2020
comment
Какой средний возраст пользователя? Разве это не возраст? Вы имеете в виду средний возраст всех пользователей?   -  person apokryfos    schedule 24.04.2020


Ответы (2)


В вашем User.php:

public function getAgeAttribute()
{
  if ($this->birthday)
    return Carbon::parse($this->birthday)->age;
  else
    return 'Unknown';
}

Если вы хотите рассчитать средний возраст ВСЕХ пользователей, поместите это там, где вам это нужно:

User:all()
    ->where('age', '!=', 'Unknown')
    ->avg('age');

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

Если атрибут birthday находится в таблице пользователей, будет более эффективным не выбирать пользователей без даты рождения:

User:whereNotNull('birthday')
    ->get()
    ->avg('age');
person Luca Puddu    schedule 24.04.2020
comment
спасибо, но у моего пользователя почти 100000, я буду очень медленным после добавления. В любом случае можно это улучшить? - person BlackLotus; 24.04.2020
comment
Если вам не нужен точный результат каждый раз, когда выполняется запрос, вы можете кэшировать средний возраст за день или около того. - person Luca Puddu; 24.04.2020

Возраст собственности для объекта Carbon не существует.

Вы можете использовать diffInYears с фактической датой для вычисления возраста

public function getAgeAttribute()
{
    if ($this->birthday)
        return Carbon::now()->diffInYears(Carbon::parse($this->birthday));
    else
        return 'Unknown';
}

В своей модели вы можете добавить защищенное свойство $ date, чтобы получить объект Carbon и не выполнять синтаксический анализ.

person Arnaud    schedule 24.04.2020
comment
age не задокументирован, но существует - person Clément Baconnier; 24.04.2020