首页 > 解决方案 > Laravel Eloquent - 从子模型访问父模型返回子模型

问题描述

扩展 Eloquent 模型似乎是人们所做的事情。我有一个有趣的问题:

FooBase.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class FooBase extends Model {
     protected $table = 'foo_bar';
}

FooExtends.php

namespace App\Models;

class FooExtends extends FooBase {
     public function method() {
           return FooBase::first(); // or even parent::first()
     }
}

调用(new FooExtends())->method()返回一个实例,FooExtends而不是FooBase。(只是静态方法受到影响,这可能会回答我自己的问题,但有人会认为 Laravel 会处理这个问题。(new FooBase())->first()从子类中调用是可行的。)这里发生了什么?

PHP 7.3,Laravel 5.7

标签: phplaravel

解决方案


这是一个非常有趣的 PHP 怪癖,它在调用祖先类时不应用静态上下文

基本上,对“静态”调用FooBase::first()的解释与 相同parent::first(),因为 PHP 知道它FooBase是当前类 context 的父级FooExtends。并且由于调用parent保持在当前对象的上下文中,first()调用最终被路由到__call()而不是(这将使用该类__callStatic()创建一个新的上下文)。FooBase

了解 PHP 内部结构和类上下文真的很有趣。谢谢你给了我一个闲逛的理由。:)


推荐阅读