Eloquent:如何在withDefault()闭包中访问相关模型?

时间:2018-01-14 13:56:39

标签: php laravel laravel-5 eloquent

我的发票模型中有与客户模型的BelongsTo关系。两个模型都有email字段,但客户端表示存在时的详细信息。 以下是我如何获得一份清单:

$invoices = Invoice::with('client');

我代表信息时使用$invoice->client->。如果找不到客户端,我需要将$invoice->client->email设置为$invoice->email->withDefault()方法运行正常,但我无法获得真实客户的电子邮件,该电子邮件存在于发票模型中。

这是我的关系:

class Invoice extends Model {

/**
 * Get an invoice client.
 */
public function client() {

    return $this->belongsTo('App\Client', 'email', 'email')->withDefault(function ($client) {
        $client->email = $invoice->email; // How can I get an invoice email?
    });
}

版本:Laravel 5.5

1 个答案:

答案 0 :(得分:1)

您说某些发票没有客户,您想要从当前模型发送电子邮件而不是父模式。在闭包中使用$this来访问Invoice模型属性:

return $this->belongsTo('App\Client', 'email', 'email')->withDefault(function ($client) {
    $client->email = $this->email;
});

但它并不适用于急切的加载。在这种情况下,您可以使用optional()帮助程序

来执行此操作
optional($invoice->client)->email ?? $invoice->email

或者您可以在Invoice模型中创建an accessor

public function getAnyEmailAttribute()
{
    return optional($this->client)->email ?? $this->email;
}

并使用它:

$invoice->anyEmail