首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Laravel雄辩:关系是如何从查询生成器继承函数的?

Laravel雄辩:关系是如何从查询生成器继承函数的?
EN

Stack Overflow用户
提问于 2021-10-13 18:04:44
回答 1查看 113关注 0票数 0

它们是如何实现的,即Illuminate\Database\Eloquent\Relations\Relation可以访问所有查询生成器函数?

我看到它们有一个$query属性,但是没有解释它的所有方法是如何在关系中可用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 01:25:22

如果您知道php 魔术法,那么当您初始化一个php对象并尝试调用类中不可用的方法时,就会知道这个方法会被调用。通过使用来自类的__call方法,它们将调用转发到Illuminate\Database\Eloquent\Builder。我将通过指出代码来非常清楚地解释它。

在laravel框架中有一个名为ForwardsCalls的特性。这个特性在许多类中被用来处理呼叫转发到另一个类。

下面是如何将来自Relation类的调用转发到Builder类。初始化新的关系类Builder时,类将是已初始化。因此,当您尝试从reltion类调用方法时,它将调用打电话方法。之后,它将寻找一个可用宏。因此,当找不到宏方法时。然后,它将使用forwardDecoratedCallTo来自ForwardsCalls特性。

因此,forwardDecoratedCallTo将接受3个参数,即$object, $method and $parameters。鉴于

  1. $object将是$this->query,它有一个Illuminate\Database\Eloquent\Builder实例。
  2. $method将是您尝试从Builder访问的方法。
  3. $parameters将是传递给该方法的所有参数。

我将试着演示一下will的例子,而不需要laravel的特征和帮助。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ClassTwo {
  
public function classTwoMethodOne()
    {
      dd(__FUNCTION__.' has been called');
    }  
  
  public function classTwoMethodTwo()
    {
      dd(__FUNCTION__.' has been called');
    }  

  public function classTwoMethodThree()
    {
    //you cannot call this method dynamically 
      dd(__FUNCTION__.' has been called');
    }  

}


class ClassOne {
  
public function classOneMethodOne()
    {
      dd(__FUNCTION__.' has been called');
    }  
  
  public function classOneMethodTwo()
    {
      dd(__FUNCTION__.' has been called');
    }  

  public function __call($methodName, $arguments)
    {
    
    $methodsTobeForwarededtoClassTwo = [
        'classTwoMethodOne',
        'classTwoMethodTwo',
      // 'classTwoMethodThree' 
      //i have commented this method so you cannot access it 
      //from dynamic calls
    ];
    if(in_array($methodName,$methodsTobeForwarededtoClassTwo))
    {
      return (new ClassTwo)->{$methodName}($arguments);
    }
             dd(sprintf(
            'Call to undefined method ClassTwo::%s()',  $methodName
        ));
    }
}

测试部分来了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$classOneobj = new ClassOne;

基本测试

  1. dump($classOneobj->classOneMethodOne());将以classOneMethodOne被称为的方式输出
  2. dump($classOneobj->classOneMethodTwo());将以classOneMethodTwo被称为的方式输出

动态呼叫测试

  1. dump($classOneobj->classTwoMethodOne());将以classTwoMethodOne被称为的方式输出
  2. dump($classOneobj->classTwoMethodTwo());将以classOneMethodTwo被称为的方式输出
  3. dump($classOneobj->classTwoMethodThree());将作为对未定义方法dump($classOneobj->classTwoMethodThree());调用输出,因为我已经在ClassOne中的__call函数中注释了该方法。

如果你还需要澄清,请发表评论

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69564270

复制
相关文章
Python | super函数是如何来继承的
Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 super(Class, self)。
用户1634449
2018/09/21
8070
Python | super函数是如何来继承的
java中什么是继承,和继承的接口的关系?
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
全栈程序员站长
2022/09/08
6700
C++:39---继承中构造函数、析构函数的关系
一、继承中构造函数的关系 如果父类没有构造函数,则子类初始化时不需要构造父类 如果父类有构造函数,则子类初始化自己的构造函数时,要先初始化父类的构造函数 基类的构造函数必须在派生类的构造函数初始化列表来进行初始化 总结:在构造自己(子类)之前,需要先构造父类 演示案例 例如:下面的父类A有构造函数,则子类B在初始化构造函数时,必须要构造父类A class A //父类 { int a_data; public: A(int data) { a_data = data; } ~A() {}//5 }; cla
用户3479834
2021/02/03
1.1K0
【C++】继承 ① ( 面向对象特点 | 类之间的关系 | 单继承与多继承 | 继承关系特性 )
本篇博客开始 讲解 IS-A 类关系 中的 继承关系 ( 泛化关系 Generalization ) ;
韩曙亮
2023/10/15
2250
C#的继承_继承关系中的被继承人
继承:是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。当创建一个类时,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类/父类,这个新的类被称为派生类/子类。
全栈程序员站长
2022/09/30
5950
C#的继承_继承关系中的被继承人
Laravel 代码生成器
今天给大家介绍一款laravel 代码生成器,用过之后才体会到其中的方便之处,大大的提高了开发效率
切图仔
2022/09/14
9830
Laravel 代码生成器
JavaScript如何借用构造函数继承
这篇文章主要介绍了JavaScript如何借用构造函数继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
用户1289394
2021/10/13
8900
Hibernate映射继承关系
在Hibernate中,继承关系是面向对象编程中常见的一个概念,主要涉及到父类与子类之间的关系。在实际开发过程中,我们有时候需要将继承关系映射到数据库中,以便进行数据操作。在Hibernate中,继承关系的映射可以使用三种方式,分别是单表继承、多表继承和一对一继承。
堕落飞鸟
2023/05/16
5420
laravel复合查询
很多情况下会用到复合查询: ---- $query->orWhere('target_type','offline'); $query->where(function($query){ $query->where('use',1)->orWhere(function($query){ $query->where('use',0) ->where('expire_t
槽痞
2020/06/23
9520
Java类是如何默认继承Object的?
学过Java的人都知道,Object是所有类的父类。但是你有没有这样的疑问,我并没有写extends Object,它是怎么默认继承Object的呢?
编程大道
2019/07/15
1.8K0
Java类是如何默认继承Object的?
Laravel 多态关系的表单验证
相信大家使用 Laravel 开发应用的时候都会有评论模块吧,而且我们通常将该模块设计为多态关系(如果你对这个关系还不明白的话,请赶紧打开 Laravel 文档数据库关系章节复习一遍吧!)。 先看看我们的数据库结构: id commentable_id commentable_type body 那么遇到一个问题,如果写入数据呢?一般来讲有两种方式,而我们通常用的一种是从父模型使用关系写入,比如我们有一个 App\Thread 类,它里面对评论的关系是这样的: class Thread {    pu
overtrue
2018/07/05
2.2K0
SQL 查询是从 Select 开始的吗?
好吧,显然很多SQL查询都是从SELECT开始的(实际上本文只是关注SELECT查询,而不是INSERT或其它别的什么)。
杰哥的IT之旅
2021/08/06
1.7K0
模型继承与对应关系
在一对多关系基础上的父表中使用backref函数,并添加uselist参数来表示一对一关系
星哥玩云
2022/09/14
1.4K0
【说站】Javascript继承关系的实现
每一个实例对象(object)都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。这个原型对象也有一个自己的原型对象(__proto__),一直到对象的原型对象为空为止。null按照定义,null没有原型,并且是该原型链的最后一个连接。
很酷的站长
2022/11/23
2910
【说站】Javascript继承关系的实现
Python教程:类的继承,什么是继承
继承描述的是子类与父类之间的关系,是一种什么是什么的关系。要找出这种关系,必须先抽象再继承,抽象即抽取类似或者说比较像的部分。
Python学习者
2023/03/01
8280
什么是继承?C# 支持多重继承吗?C#如何实现多重继承?
它是 C# 中允许一个类继承另一个类的特性(字段和方法)的机制,是面向对象(封装,继承,多态)的一个特征。
kdyonly
2023/03/03
9920
点击加载更多

相似问题

关于雄辩关系的Laravel查询生成器

24

Laravel -如何查询雄辩关系?

16

Laravel雄辩关系查询

12

laravel雄辩查询关系

11

来自查询生成器的laravel雄辩的关系

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文