laravel 中可以为空的 hasOne 不工作
hasOne with null-able in laravel not working
我有一个客户 table,它有一个名为 'policy_id' 的字段,其中 policy_id 指向策略 table。它是一个可以为空的字段,即。有些客户可能没有政策。
我在 Customer.php
中有这样的关系代码
public function policy() {
return $this->hasOne('App\Models\Policy', "id", "policy_id");
}
但是当我发出搜索请求时,出现如下错误:
Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\Policy]
如果我这样修改函数:
public function policy() {
if ($this->getAttribute('policy_id')) {
return $this->hasOne('App\Models\Policy', "id", "policy_id");
} else {
return null
}
}
但是我收到这样的错误:
Call to a member function getRelationExistenceQuery() on null
这是我的搜索代码:
$c = new Customer();
return Customer::doesntHave('policy')->orWhere(function (Builder $query) use ($req) {
$query->orWhereHas('policy', function (Builder $query) use ($req) {
$p = new Policy();
$query->where($req->only($p->getFillable()))
->orWhereBetween("policy_period_from", [$req->policy_period_start_from, $req->policy_period_start_to])
->orWhereBetween("policy_period_to", [$req->policy_period_end_from, $req->policy_period_end_to])
->orWhereBetween("payment_date", [$req->payment_date_from, $req->payment_date_to]);
});
})->where($req->only($c->getFillable()))->get();
我是不是遗漏了什么或者有其他方法可以做到这一点吗?
PS:虽然调试上面的搜索代码成功返回,但是在 prepareResponse 调用后 Laravel 内部某处发生异常。
提前致谢。
return $this->hasOne('App\ModelName', 'foreign_key', 'local_key');
换个顺序,把foreign_keypolicy_id
放在id
前面
在您的客户模型中,您需要使用 belongsTo 方法:
public function policy() {
return $this->belongsTo('App\Models\Policy', "policy_id", "id");
}
并且在您的策略模型中,使用 hasOne:
public function customer() {
return $this->hasOne('App\Models\Customer', "policy_id", "id");
}
首先,你设置了错误的参数。
$this->belongsTo('App\Models\Policy', "FK", "PK");
public function policy() {
return $this->belongsTo('App\Models\Policy','policy_id', 'id');
}
对于 policy_id 的 null
值,您可以使用 withDefault();
public function policy() {
return $this->belongsTo('App\Models\Policy','policy_id', 'id')->withDefault([
'name' => 'test'
]);;
}
那里有很多问题,但您能否指定两个模型的名称空间和 class - 客户和策略。
默认情况下,您使用 php artisan make:model
创建的模型将使用 \App 命名空间,例如\App\Customer 和 \App\Policy。
仔细检查一下。
此外,关于关系,如果遵循 Laravel 约定,您可以:
在客户模型中
public function policy() {
return $this->belongsTo(Policy::class);
}
在策略模型中
public function customer() {
return $this->hasOne(Customer::class);
}
如果多个客户可以在一个政策下
public function customers() {
return $this->hasMany(Customer::class);
}
祝你好运
我有一个客户 table,它有一个名为 'policy_id' 的字段,其中 policy_id 指向策略 table。它是一个可以为空的字段,即。有些客户可能没有政策。 我在 Customer.php
中有这样的关系代码public function policy() {
return $this->hasOne('App\Models\Policy', "id", "policy_id");
}
但是当我发出搜索请求时,出现如下错误:
Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\Policy]
如果我这样修改函数:
public function policy() {
if ($this->getAttribute('policy_id')) {
return $this->hasOne('App\Models\Policy', "id", "policy_id");
} else {
return null
}
}
但是我收到这样的错误:
Call to a member function getRelationExistenceQuery() on null
这是我的搜索代码:
$c = new Customer();
return Customer::doesntHave('policy')->orWhere(function (Builder $query) use ($req) {
$query->orWhereHas('policy', function (Builder $query) use ($req) {
$p = new Policy();
$query->where($req->only($p->getFillable()))
->orWhereBetween("policy_period_from", [$req->policy_period_start_from, $req->policy_period_start_to])
->orWhereBetween("policy_period_to", [$req->policy_period_end_from, $req->policy_period_end_to])
->orWhereBetween("payment_date", [$req->payment_date_from, $req->payment_date_to]);
});
})->where($req->only($c->getFillable()))->get();
我是不是遗漏了什么或者有其他方法可以做到这一点吗?
PS:虽然调试上面的搜索代码成功返回,但是在 prepareResponse 调用后 Laravel 内部某处发生异常。
提前致谢。
return $this->hasOne('App\ModelName', 'foreign_key', 'local_key');
换个顺序,把foreign_keypolicy_id
放在id
在您的客户模型中,您需要使用 belongsTo 方法:
public function policy() {
return $this->belongsTo('App\Models\Policy', "policy_id", "id");
}
并且在您的策略模型中,使用 hasOne:
public function customer() {
return $this->hasOne('App\Models\Customer', "policy_id", "id");
}
首先,你设置了错误的参数。
$this->belongsTo('App\Models\Policy', "FK", "PK");
public function policy() {
return $this->belongsTo('App\Models\Policy','policy_id', 'id');
}
对于 policy_id 的 null
值,您可以使用 withDefault();
public function policy() {
return $this->belongsTo('App\Models\Policy','policy_id', 'id')->withDefault([
'name' => 'test'
]);;
}
那里有很多问题,但您能否指定两个模型的名称空间和 class - 客户和策略。
默认情况下,您使用 php artisan make:model
创建的模型将使用 \App 命名空间,例如\App\Customer 和 \App\Policy。
仔细检查一下。
此外,关于关系,如果遵循 Laravel 约定,您可以:
在客户模型中
public function policy() {
return $this->belongsTo(Policy::class);
}
在策略模型中
public function customer() {
return $this->hasOne(Customer::class);
}
如果多个客户可以在一个政策下
public function customers() {
return $this->hasMany(Customer::class);
}
祝你好运