使用 Eloquent 模型 class。静态方法"where"的实现在哪里?
Using Eloquent Model class. Where is the implementation of static method "where"?
考虑这段代码
$match_get1 = Model::where(SyncVariableConstant::MAIN_ID_FIELD_NAME, $sqlId)->get();
真不明白where静态方法在Model::class中的定义在哪里语境。模型 class 未实现方法 where (source).
显然,我认为这是一种我不熟悉的php机制...
有人解释一下吗?
提前致谢
'magic'实际上发生在魔术方法__callStatic
和__call()
中Model.php
。
如果在 class 中找不到某个方法,很可能是这些魔术方法正在处理它。
如果你在__call()
里面放一个dd($method);
,你会得到where
。
来自PHP doc:
__call() is triggered when invoking inaccessible methods in an object context.
模型通常扩展 Eloquent
门面,这只是底层 app('db')
实例的快捷方式。
您要查找的 where()
方法位于 \Illuminate\Database\Query\Builder
命名空间中。此命名空间由 Eloquent ORM 使用,其代码位于 \Illuminate\Database\Eloquent\Builder
命名空间内。两个 classes 都有 where()
方法。如果你检查后者 class,你会看到在它的构造函数中它注入了前者 class 作为依赖项(即依赖注入)。
简而言之,\Illuminate\Database\Eloquent\Builder
是\Illuminate\Database\Query\Builder
的高级用户,两者都where()
实现了。
以及\Illuminate\Database\Eloquent\Builder
调用的级别有多高?正如此处的另一位用户已经指出的那样,通过 magic-getter __call()
考虑这段代码
$match_get1 = Model::where(SyncVariableConstant::MAIN_ID_FIELD_NAME, $sqlId)->get();
真不明白where静态方法在Model::class中的定义在哪里语境。模型 class 未实现方法 where (source).
显然,我认为这是一种我不熟悉的php机制...
有人解释一下吗?
提前致谢
'magic'实际上发生在魔术方法__callStatic
和__call()
中Model.php
。
如果在 class 中找不到某个方法,很可能是这些魔术方法正在处理它。
如果你在__call()
里面放一个dd($method);
,你会得到where
。
来自PHP doc:
__call() is triggered when invoking inaccessible methods in an object context.
模型通常扩展 Eloquent
门面,这只是底层 app('db')
实例的快捷方式。
您要查找的 where()
方法位于 \Illuminate\Database\Query\Builder
命名空间中。此命名空间由 Eloquent ORM 使用,其代码位于 \Illuminate\Database\Eloquent\Builder
命名空间内。两个 classes 都有 where()
方法。如果你检查后者 class,你会看到在它的构造函数中它注入了前者 class 作为依赖项(即依赖注入)。
简而言之,\Illuminate\Database\Eloquent\Builder
是\Illuminate\Database\Query\Builder
的高级用户,两者都where()
实现了。
以及\Illuminate\Database\Eloquent\Builder
调用的级别有多高?正如此处的另一位用户已经指出的那样,通过 magic-getter __call()