[英]Make PHPStan understand Laravel Eloquent Builder query()
I am having a hard time making larastan / phpstan understand that query()
should be based on Company
model and not Eloquent\Model
.我很难让 larastan / phpstan 明白
query()
应该基于Company
model 而不是 Eloquent Eloquent\Model
。 What am I missing?我错过了什么?
<?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();
}
}
And this is causing this error:这导致了这个错误:
Method App\Repositories\CompanyRepository::firstByDomain() should return App\Models\Company|null but returns Illuminate\Database\Eloquent\Model|null.
方法 App\Repositories\CompanyRepository::firstByDomain() 应该返回 App\Models\Company|null 但返回 Illuminate\Database\Eloquent\Model|null。
It seems to me that this is caused by the query()
method, returning an Eloquent Builder for Illuminate\Database\Eloquent\Model
where I believe it should return an Eloquent Builder for App\Models\Company
here.在我看来,这是由
query()
方法引起的,为Illuminate\Database\Eloquent\Model
返回一个 Eloquent Builder,我认为它应该在这里为App\Models\Company
返回一个 Eloquent Builder。
You need to change the query
method in AbstractBaseRepository
to something like this:您需要将
AbstractBaseRepository
中的query
方法更改为如下所示:
/** @return Builder<TModel> */
public function query(): Builder
{
return $this->model->query();
}
because Builder
class is also generic.因为
Builder
class 也是通用的。 Also PHPStan does not check the function/method bodies. PHPStan 也不检查函数/方法体。 So your return type needs to be accurate.
所以你的返回类型需要准确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.