我在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
为空。
是否可以通过关系方法访问正在使用的模型的属性?
答案 0 :(得分:0)
弄清楚了。由于我实际上是在同一张表上进行自联接,因此可以将“本地”和“外部” ID列指定为我要匹配的列:
public function parent() {
return $this->hasOne("Thingy", "type", "type")->where("parent"=>1);
}
我想关键概念是要记住,我正在定义模型的两个实例之间的关系,该关系独立于我正在处理的特定实例。