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);
}

祝你好运