php - 从关系函数访问模型属性
问题描述
我在我的 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
是空的。
有没有办法从关系方法中访问我正在使用的模型的属性?
解决方案
想通了。由于我实际上是在同一张表上进行自联接,因此我可以将“本地”和“外国”ID 列指定为我要匹配的列:
public function parent() {
return $this->hasOne("Thingy", "type", "type")->where("parent"=>1);
}
我想关键概念是记住我正在定义模型的两个实例之间的关系,它独立于我正在处理的特定实例。
推荐阅读
- qt - 将 boundingRect() 映射到父项并相交会产生意外的碰撞处理结果
- java - Vertx WebClient 下载文件
- devise - ActiveAdmin 错误 401 无法再使用有效凭据登录。使用导轨 5.2
- php - 我可以使用 laravel 队列自动删除一些表记录吗?
- node.js - CentOS 7 NodeJs 应用程序 - 502 错误网关
- python - 使用 Numpy 进行傅里叶变换
- java - 单击按钮时随机化数组中的颜色
- typescript - 是否可以在 TypeScript 中使用 `extends` 或 `implements` 强制构造函数参数类型?
- c++ - 这个 C++ 类是否泄漏内存?
- bash - 如何使用shell将具有特定名称要求的文件复制到直接父目录