Как реализовать hasOne с необязательным отношением - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть таблица клиентов, подобная этой

id
name

Другая политика таблиц, подобная этой

id
policy_name

, и еще одна таблица policy_customer, подобная этой

id 
customer_id
policy_id

In мою модель клиента я написал так:


    protected $appends = ['policy_customer'];

    public function policy_customer() {
        return $this->hasOne('App\Models\PolicyCustomer', "customer_id", "id");
    }

    public function getPolicyCustomerAttribute(){
        return $this->policy_customer()->firstOrFail();
    }

и в модели PolicyCustomer


    public function policy() {
        return $this->belongsTo('App\Models\Policy', "policy_id", "id");
    }

    public function customer() {
        return $this->belongsTo('App\Models\Customer', "customer_id", "id");
    }

У всех клиентов может не быть политики, связанной с их учетной записью. Когда я запрашиваю Customer :: get (), это не проблема. Но если я пытаюсь вернуть это как ответ контроллера, я получаю ошибку, подобную приведенной ниже:


[2020-02-06 06:11:47] local.ERROR: Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\PolicyCustomer]. in D:\Projects\others\jayhawker\backend\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php:454
Stack trace:
#0 D:\Projects\others\jayhawker\backend\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php(23): Illuminate\Database\Eloquent\Builder->firstOrFail()
#1 D:\Projects\others\jayhawker\backend\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Relations\Relation.php(385): Illuminate\Database\Eloquent\Relations\Relation->forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), 'firstOrFail', Array)
#2 D:\Projects\others\jayhawker\backend\app\Models\Customer.php(41): Illuminate\Database\Eloquent\Relations\Relation->__call('firstOrFail', Array)
#3 D:\Projects\others\jayhawker\backend\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php(454): App\Models\Customer->getPolicyAttribute(NULL)
#

Если я удаляю функцию getPolicyCustomerAttribute из модели Customer, она не выдает исключение. Я что-то упустил?

1 Ответ

0 голосов
/ 06 февраля 2020

Просто удалите свой метод доступа getPolicyCustomerAttribute. Все методы отношений автоматически предоставляют атрибут с тем же именем, который будет содержать результаты отношения.

То есть $customer->policy_customer будет либо содержать связанный экземпляр PolicyCustomer, либо будет null, если есть нет связанной записи.

$customer->policy_customer === $customer->policy_customer()->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...