gpt4 book ai didi

php - Laravel 自定义模型方法

转载 作者:IT王子 更新时间:2023-10-29 01:02:17 26 4
gpt4 key购买 nike

每当我向 Eloquent 模型添加额外的逻辑时,我最终不得不将其设为 static 方法(即不太理想),以便从模型的外观调用它。我已经尝试了很多关于如何以正确的方式执行此操作的内容,并且几乎所有结果都讨论了创建返回部分查询生成器接口(interface)的方法。我试图弄清楚如何添加可以返回任何内容并使用模型外观调用的方法。

例如,假设我有一个名为 Car 的模型并且想要全部获取:

$cars = Car::all();

很好,除了现在,假设我想通过 make 将结果排序为一个多维数组,所以我的结果可能如下所示:

$cars = array(
'Ford' => array(
'F-150' => '...',
'Escape' => '...',
),
'Honda' => array(
'Accord' => '...',
'Civic' => '...',
),
);

以这个理论示例为例,我很想创建一个可以像这样调用的方法:

$cars = Car::getAllSortedByMake();

暂时,让我们忘记可怕的方法名称以及它与数据结构紧密耦合的事实。如果我在模型中创建这样的方法:

public function getAllSortedByMake()
{
// Process and return resulting array
return array('...');
}

最后在我的 Controller 中调用它,我会抛出这个异常:

Non-static method Car::getAllSortedByMake() should not be called statically, assuming $this from incompatible context

TL;DR:如何在不使其成为静态方法并使用模型的外观调用它的情况下添加对模型有意义的自定义功能?


编辑:

这是一个理论上的例子。也许改写这个问题会更有意义。为什么在 Eloquent 模型的外观上可以使用某些非静态方法,例如 all()which(),但没有添加到模型中的其他方法?这意味着正在使用 __call 魔术方法,但是我怎样才能让它识别我自己在模型中的函数呢?

可能比“排序”更好的例子是如果我需要对一条数据运行计算或算法:

$validSPG = Chemical::isValidSpecificGravity(-1.43);

对我来说,将类似的东西放在模型中是有意义的,因为它是特定于领域的。

最佳答案

My question is at more of a fundamental level such as why is all() accessible via the facade?

如果你查看 Laravel Core - all() 实际上是一个静态函数

public static function all($columns = array('*'))

你有两个选择:

public static function getAllSortedByMake()
{
return Car::where('....')->get();
}

public function scopeGetAllSortedByMake($query)
{
return $query->where('...')->get();
}

两者都允许你这样做

Car::getAllSortedByMake();

关于php - Laravel 自定义模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com