ELOQUENT - Расчет разницы в datetime в выражении where - PullRequest
1 голос
/ 20 октября 2019

Я пытаюсь проверить, не превышает ли разница двух столбцов в моей базе данных указанное количество лет, то есть DATETIME - BIRTHDATE <лет </p>

Я пытался;

$result->where(date_diff((strtotime('datetime')-strtotime('student.birth'), '<', $request->search);

Тем не менее, я получаю сообщение об ошибке, сообщающее, что

return type of strtotime is a boolean

Теперь у меня заканчиваются идеи. Любая помощь будет оценена.

Редактировать: для уточнения: Значение.php:

public function student()
{
    return $this->belongsTo(\App\Student::class);
}

и Student.php

    public function values()
{
    return $this->hasMany(\App\Value::class);
}

Втаблица студентов, которую я сохранил:

$table->DateTime('birth');            

В таблице значений это:

$table->DateTime('datetime');
$table->unsignedBigInteger('student_id');
$table->foreign('student_id')->references('id')->on('students');

2-е редактирование:

Благодаря @motia, я отредактировал свойкод:

$age = $search->age;

Это считывает возраст из запроса, работает отлично ... но затем ..:

    $result = Value::query()
        ->whereHas('student', function($q) use($age) {
        $q->whereRaw(
            'TIMESTAMPDIFF(YEAR, students.birth, values.datetime) < ?', [$age]
            );
        })
        ->get(); 

выдает ошибку, заявляющую:

SQLSTATE [HY000]: общая ошибка: 1 нет такой функции: TIMESTAMPDIFF (SQL: выберите * из «значений», где существует (выберите * из «студентов», где «значения». «Student_id» = «студентов». «Id»)и TIMESTAMPDIFF (YEAR, Students.birth, datetime) <19)) </p>

(19 - пример моего значения для возраста)

1 Ответ

0 голосов
/ 20 октября 2019

В вашем коде вы выполняете условие для фильтрации таблицы в вашем PHP-коде, а не строите запрос и позволяете базе данных выполнять SQL.

При запросе вы должны подумать о построении правильной строки выражения SQL.

В вашем случае нужное выражение условия не может быть построено с query->where, поэтому вам нужно использовать query->whereRaw

Value::query()
// To execute relationships with Elquent use whereHas
// eloquent will generate a "WHERE ... EXISTS" sql expression
->whereHas('student', function ($query) use ($request) {
    // here the $query is executed on the relationship table

    // to get the difference in years use the SQL function TIMESTAMPDIFF
    // its 3rd arg should be the latest date to have positive difference
    $query->whereRaw(
      'TIMESTAMPDIFF(YEAR, students.birth, values.datetime) < ?' , [$request->search]
    );
});

EDIT Приведенный выше пример работает только с базами данных mysql. Для SQLITE условие должно быть

'(JulianDay(values.datetime) - JulianDay(students.birth)) / 365.25 < ?' 

А для PostgreSQL

'EXTRACT(YEAR from AGE(values.datetime, students.birth)) < ?' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...