加载模型的所有关系

车海伦

通常渴望加载一段关系,我会做这样的事情:

Model::with('foo', 'bar', 'baz')...

解决方案可能是设置一个,$with = ['foo','bar','baz']但是每次我打电话时,总是加载这三个关系Model

是否有可能做这样的事情:Model::with('*')

马塞尔·格沃德(Marcel Gwerder)

不,不是,至少没有一些额外的工作,因为在实际加载模型之前,您的模型不知道它支持哪种关系。

我在自己的Laravel软件包之一中遇到了这个问题。无法获得与Laravel的模型关系的列表。但是,如果您看一下它们的定义,这是很明显的。返回Relation对象的简单函数您甚至无法使用php的反射类获得函数的返回类型,因此无法区分关系函数和任何其他函数。

您可以做的就是简化定义添加所有关系的函数。为此,您可以使用雄辩的查询范围(感谢Jarek Tkaczyk在评论中提到它)。

public function scopeWithAll($query) 
{
    $query->with('foo', 'bar', 'baz');
}

使用范围而不是静态函数,不仅使您不仅可以直接在模型上使用函数,而且还可以在where以任何顺序链接查询构建器方法时使用

Model::where('something', 'Lorem ipsum dolor')->withAll()->where('somethingelse', '>', 10)->get();

获得支持关系的替代方法

尽管Laravel不支持这种开箱即用的功能,但是您可以自己添加它。

注解

我在上面提到的包中使用批注来确定函数是否是关系。注释并不是php的正式组成部分,但是很多人使用doc块来模拟它们。Laravel 5还将在其路线定义中使用注释,因此我认为在这种情况下这不是一个坏习惯。优点是,您不需要维护受支持关系的单独列表。

为每个关系添加注释:

/**
 * @Relation
 */
public function foo() 
{
    return $this->belongsTo('Foo');
}

并编写一个解析模型中所有方法的doc块并返回名称的函数。您可以在模型或父类中执行此操作:

public static function getSupportedRelations() 
{
    $relations = [];
    $reflextionClass = new ReflectionClass(get_called_class());

    foreach($reflextionClass->getMethods() as $method) 
    {
        $doc = $method->getDocComment();

        if($doc && strpos($doc, '@Relation') !== false) 
        {
            $relations[] = $method->getName();
        }
    }

    return $relations;
}

然后在您的withAll函数中使用它们

public function scopeWithAll($query) 
{
    $query->with($this->getSupportedRelations());
}

有些像php中的注释,有些则不然。我喜欢这个简单的用例。

支持的关系数组

您还可以维护所有支持的关系的数组。但是,这需要您始终将其与可用的关系保持同步,尤其是在涉及多个开发人员的情况下,这并非总是那么容易。

protected $supportedRelations = ['foo','bar', 'baz'];

然后在您的withAll函数中使用它们

public function scopeWithAll($query) 
{
    return $query->with($this->supportedRelations);
}

当然,您也可以with像在他的回答中提到的lukasgeiter那样重写这似乎比使用干净withAll但是,如果您使用注释或配置数组,则是一个意见问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何加载所有模型的所有关联

来自分类Dev

Laravel获得所有具有关系的模型

来自分类Dev

laravel5.2删除所有关系的模型

来自分类Dev

删除与static :: deleting模型的所有关系

来自分类Dev

如何列出django中所有模型的所有关系和外键?

来自分类Dev

Laravel-具有所有关系的dd()模型

来自分类Dev

在模型编译之后还是之前加载权重有关系吗?

来自分类Dev

建立具有关系的模型响应

来自分类Dev

如何播种与自身有关系的模型

来自分类Dev

从Oracle Data Modeler将所有关系模型导出为PDF

来自分类Dev

将所有关系及其子女加载到Laravel中

来自分类Dev

预载所有关系

来自分类Dev

Laravel雄辩的所有关系

来自分类Dev

如何在具有关系总和的Laravel模型上使用紧急加载-当前获得多个查询(N + 1)

来自分类Dev

遵循所有关系,但不遵循特定关系

来自分类Dev

Laravel 4渴望加载-所有关系都推到第一个返回的对象

来自分类常见问题

Laravel。在具有关系的模型中使用scope()

来自分类Dev

Flask:使用带有关系的SQLalchemy模型填充WTform

来自分类Dev

获取与其他集合有关系的模型

来自分类Dev

Django 模型在有关系的地方获取数据

来自分类Dev

获取具有密码的节点的所有关系

来自分类Dev

CoreData。提取所有具有关系的实体

来自分类Dev

查找所有没有关系的实体

来自分类Dev

动态库的加载顺序有关系吗?

来自分类Dev

具有关系的SQLAlchemy ORM自动加载

来自分类Dev

模型具有所有关联的Rails

来自分类Dev

模型具有所有关联的Rails

来自分类Dev

OrientDb-获取节点及其所有关系

来自分类Dev

Laravel,删除记录时更新所有关系

Related 相关文章

热门标签

归档