有没有办法将参数指定为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);
我有一个函数只接受 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);