有没有办法将参数指定为Laravel中某个模型的集合?

Is there a way to specify argument as collection of a certain model in Laravel?

我有一个函数只接受 Eloquent Collection。这没关系,但我真的想指定它只能接受特定模型的集合。是否可以指定我们只想要某个类型的集合来函数参数?

这是我现在拥有的:

use Illuminate\Database\Eloquent\Collection as EloquentCollection;

/**
 * @param EloquentCollection $companies
 * @return array
 */
public function transformCompanies(EloquentCollection $companies)
{
    $companies->each(function($company){
       // do things with the company object..
    });
    
}

我看到的问题是它接受任何类型的集合。我可以做类似 public function transformCompanies(CompaniesCollection $companies) 的事情吗?它是如何工作的?如果我们希望此函数仅接受公司模型的 Eloquent 集合,use 语句会在顶部是什么?

您可以 implement your own class 扩展 Collection,然后指定您希望将其用于您的模型集合。我从未使用过该功能,但类似这样的功能应该可以使用:

<?php
namespace App\Support;

use Illuminate\Database\Eloquent\Collection;

class CompaniesCollection extends Collection {}

然后在模型中定义 newCollection() 方法:

<?php
namespace App\Models;

use App\Support\CompaniesCollection;
use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    public function newCollection(array $models = []): CompaniesCollection
    {
        return new CompaniesCollection($models);
    }
}

现在你的控制器方法可以有这样的签名:

public function transformCompanies(App\Support\CompaniesCollection $companies);