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

Php 雄辩:如何在withDefault()闭包中访问相关模型?,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,在我的发票模型中,与客户模型存在BelongsTo关系。这两个模型都有一个电子邮件字段,但客户端在存在时表示详细信息。 下面是我如何获得列表的: $invoices = Invoice::with('client'); 当表示信息时,我使用$invoice->client->。如果找不到客户,我需要将$invoice->client->email设置为$invoice->email->withDefault()方法工作正常,但我无法获得发票模型中存在的真正客户的电子邮件 这是我的亲戚: cla

在我的发票模型中,与客户模型存在BelongsTo关系。这两个模型都有一个
电子邮件
字段,但客户端在存在时表示详细信息。 下面是我如何获得列表的:

$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

您已经说过一些发票没有客户端,您希望从当前型号而不是父型号发送电子邮件。在闭包中使用
$this
访问
发票
模型属性:

return $this->belongsTo('App\Client', 'email', 'email')->withDefault(function ($client) {
    $client->email = $this->email;
});
但它不适用于急切加载。在这种情况下,您可以使用
optional()
helper:

optional($invoice->client)->email ?? $invoice->email
或者您可以在
发票
模型中创建:

public function getAnyEmailAttribute()
{
    return optional($this->client)->email ?? $this->email;
}
并使用它:

$invoice->anyEmail

你能描述一下你到底想达到什么目的吗?你有没有没有未附上客户的发票?@AlexeyMezenin我有附有“客户”的发票,我有没有任何“客户”的发票。所有发票都有一个电子邮件字段,但并非所有客户都有相同的电子邮件。在这两种情况下,我都需要正确获取$invoice->client->email。请检查答案。我已经测试过了,效果很好。这是我第一次尝试$发票->客户->电子邮件返回空:(@AlexeyAlshenetsky对我有效。我尝试使用当前模型中的
created_at
属性和
$model->parent->created_at
返回的
$model->created_at
dd($invoice->client);
show for a invoice with a client?它显示带有#属性的输出:数组:1[▼ “email”=>null]@AlexeyAlshenetsky如果在Tinker中执行此操作,请在更改关系代码后重新运行。如果执行此操作,
$client->email=$this;
则在执行
dd($Invoice->client)操作时,应在数组中显示整个
Invoice
对象
。是的,它向我显示整个
发票
对象。属性为空
设置且
存在:false