【发布时间】:2017-11-25 17:59:00
【问题描述】:
我的EloquentModels 中有各种关系,如下所示:
public function main_image()
{
return $this->hasOne(Media::class, 'id', 'main_image_id');
}
但是,如果main_image_id 为 null 或 0,它将运行 SQL 查询,所以我最终会得到许多这样的查询:
select * from `media` where `media`.`id` is null and `media`.`id` is not null limit 1
这显然不会返回任何东西,但仍然浪费资源。有什么方法可以自动检查吗?
目前我所做的是有一个方法,比如hasMainImage(),它检查main_image_id 不为空也不为0,但是当前的很多系统已经使用了这些关系,我想知道是否可以添加检查关系方法本身?
我尝试向它添加检查并返回null,如果该列没有实际值,但我有一个Exception,它必须返回一个关系对象。或者,如果我尝试 Eager 加载它,我会收到以下错误:
Call to a member function addEagerConstraints() on null
public function main_image()
{
if (!$this->main_image_id) {
return null;
}
return $this->hasOne('App\Modules\Media\Models\Media', 'id', 'main_image_id');
}
感谢您的帮助!
编辑: 一个也许更清楚的例子:
$page = Page::find(1);
var_dump($page->main_image); // This will run a query as shown above that is guaranteed to return nothing
// Since at this point system knows that $page->main_image_id is 0 or null, I would like to use that to not run the query and automatically set $page->main_image to null
【问题讨论】:
-
执行
with会使用额外的资源。你不应该一开始就这样做,也不应该到处都这样做,然后试图绕过它。 -
with并非在任何地方使用,仅在一次加载多个模型的情况下使用。当仅加载单个实例时,不使用with,并进行$page->main_image之类的调用。这些是我在这里尝试优化的调用 -
这样做没有额外的好处。无论哪种方式加入都会发生,它只会返回更少的东西。我当然假设你在这里是一对一的关系。
-
我的目标不是运行 SQL 查询,当我知道
$page->main_image_id是0或null时,我正在执行类似$page->main_image的调用。我需要在模型的方法级别进行检查。 -
如果您渴望加载,那么
$page->main_image不会/不应触发单个查询。查询是在整个结果集上抢先完成的。
标签: php mysql laravel eloquent