从关系函数访问模型属性

问题描述 投票:0回答:1

我在我的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为null。

有没有办法在关系方法中访问我正在使用的模型的属性?

php laravel eloquent
1个回答
0
投票

弄清楚了。由于我基本上是在同一个表上进行自联接,因此我可以将“本地”和“外部”ID列指定为我要匹配的列:

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

我想关键概念是要记住我正在定义模型的两个实例之间的关系,这与我正在处理的特定实例无关。

© www.soinside.com 2019 - 2024. All rights reserved.