【问题标题】:Is there a way to specify argument as collection of a certain model in Laravel?有没有办法将参数指定为 Laravel 中某个模型的集合?
【发布时间】:2020-11-19 23:15:52
【问题描述】:

我有一个只接受 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 语句会是什么?

【问题讨论】:

    标签: php laravel eloquent laravel-collection


    【解决方案1】:

    您可以将 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2013-06-06
      • 2013-02-15
      • 2021-11-19
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多