Используете отношения Eloquent внутри средства доступа Eloquent? - PullRequest
0 голосов
/ 11 июня 2019

Я пишу приложение Laravel, которое управляет учебными курсами.

Каждый курс представлен моделью курса.

Курс может иметь много дат - они представлены моделью CourseDate,с отношением hasMany между ними:

Каждый курс также имеет один «шаблон даты», который является CourseDate, но с логическим набором «is_template».

Я хочу создатьметод доступа к модели курса, который получает шаблон даты.

(соответствующий) код для каждой модели:

class Course extends Model {
    public function getDateTemplateAttribute() {
        $dates = $this->dates;
        $filtered = $dates->where('is_template', true);
        $template = $filtered->first();
        return $template;
    }

    public function dates() {
        $result = $this->hasMany( CourseDate::class );
        return $result;
    }
}

class CourseDate extends Model {
    public function course() {
        return $this->belongsTo( Course::class );
    }
}

Затем в контроллере у меня есть следующее:

// this block works absolutely perfectly
$course = Course::find(1);
$dates = $course->dates;
$working_date_template = $dates->where('is_template', true)->first();

// this one doesn't work at all and says "call to a member function first() on array"
$broken_date_template = $course->date_template;

Проходя через xdebug в неработающем коде, строка $dates = $this->dates возвращает пустой массив, поэтому все остальное впоследствии прерывается.

Это ограничение системы доступа / отношений Laravel?Или я просто тупой и делаю что-то не так.

1 Ответ

0 голосов
/ 11 июня 2019

Я понял это только сейчас.

Мне нужно было использовать $this->dates() внутри самой модели, так как это возвращает отношение, и я могу затем отфильтровать его соответствующим образом, используя метод where() и другие методы построителя запросов.

Это, конечно, упоминалось в документации Laravel - я просто не заметил этого.

...