我需要使用Yii2框架从名为 person 的表中选择21岁以下的人。
人=(id,生日)
public static function findByBirthday($idper) {
$query = Persons::find()
->select([
Persons::tableName().".[[id]]",
Persons::tableName().".[[birthday]]"
])
->where([
'<=',
'select age(birthday, NOW())',
21
])
return $query->asArray()->all();
}
答案 0 :(得分:1)
如果生日是有效的DATE类型
public static function findByBirthday($idper) {
$query = Persons::find()
->select([
Persons::tableName().".[[id]]",
Persons::tableName().".[[birthday]]"
])
->where([
'<=',
'EXTRACE(year from age(birthday))',
21
])
return $query->asArray()->all();
}
或
->where( 'EXTRACE(year from age(birthday)) <= 21')
答案 1 :(得分:1)
您可以将birthday
与21年前的日期进行比较-对于年龄计算,它应该比表达式更好地重用索引,并且结果将是相同的。
public static function findByBirthday($idper) {
$query = Persons::find()
->select([
Persons::tableName() . ".[[id]]",
Persons::tableName() . ".[[birthday]]",
])
->where([
'>=',
'birthday',
new Expression('date :date', [
':date' => date('Y-m-d', strtotime('-21 years')),
]),
]);
return $query->asArray()->all();
}