Доступ к свойствам модели из функции отношения - PullRequest
0 голосов
/ 01 ноября 2018

У меня был установлен метод доступа в моей модели Eloquent, который работал нормально, но соответствующий запрос к базе данных запускался один раз для каждого экземпляра модели, которую я создал. На моей странице индекса это означало 5 дюжин запросов.

<?php
class Thingy extends Model {
    protected $appends = ["parentType"];
    public function getParentTypeAttribute($value) {
        return self::where("type"=>$this->type, "parent"=>1)->value("name");
    }
}

class ThingyController extends Controller {
    public function index() {
        $thingys = Thingy::all();
        return view("things.index", compact("thingys"));
    }
}

Для краткого объяснения: в одной таблице базы данных есть два класса "thingy", причем этот класс обозначается логическим значением с именем "parent". Я хочу получить имя родителя, когда я получаю доступ к ребенку. Я знаю, что это должно быть две таблицы, но это не так.

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

<?php
class Thingy extends Model {
    public function parent() {
        return $this->hasOne("Thingy", "id")->where("type"=>$this->type, "parent"=>1);
    }
}

class ThingyController extends Controller {
    public function index() {
        $thingys = Thingy::with(["parent"]);
        return view("things.index", compact("thingys"));
    }
}

Проблема в том, что в методе отношений $this является пустым экземпляром модели, в отличие от средства доступа, поэтому $this->type является нулевым.

Есть ли способ доступа к свойствам модели, с которой я работаю, из метода отношений?

1 Ответ

0 голосов
/ 01 ноября 2018

понял это. Поскольку я, по сути, выполняю самостоятельное объединение для одной и той же таблицы, я могу указать столбцы «локального» и «внешнего» идентификатора в качестве столбца, который я пытаюсь сопоставить:

public function parent() {
    return $this->hasOne("Thingy", "type", "type")->where("parent"=>1);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...