[英]Make PHPStan understand Laravel Eloquent Builder query()
我很難讓 larastan / phpstan 明白query()
應該基於Company
model 而不是 Eloquent Eloquent\Model
。 我錯過了什么?
<?php
namespace App\Repositories;
use App\Models\Company;
/**
* @extends AbstractBaseRepository<Company>
*/
class CompanyRepository extends AbstractBaseRepository
{
public function __construct()
{
parent::__construct(new Company());
}
public function firstByDomain(string $domain): ?Company
{
return $this->query()
->where('domain', $domain)
->first();
}
}
<?php
namespace App\Repositories;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* @template TModel of Model
*/
abstract class AbstractBaseRepository
{
/** @var TModel */
protected $model;
/** @param TModel $model */
public function __construct(Model $model)
{
$this->model = $model;
}
public function query(): Builder
{
return $this->model->query();
}
}
這導致了這個錯誤:
方法 App\Repositories\CompanyRepository::firstByDomain() 應該返回 App\Models\Company|null 但返回 Illuminate\Database\Eloquent\Model|null。
在我看來,這是由query()
方法引起的,為Illuminate\Database\Eloquent\Model
返回一個 Eloquent Builder,我認為它應該在這里為App\Models\Company
返回一個 Eloquent Builder。
您需要將AbstractBaseRepository
中的query
方法更改為如下所示:
/** @return Builder<TModel> */
public function query(): Builder
{
return $this->model->query();
}
因為Builder
class 也是通用的。 PHPStan 也不檢查函數/方法體。 所以你的返回類型需要准確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.