You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.5:如何在withDefault()闭包中访问关联模型?

解决Laravel 5.5中关联默认模型获取主模型属性的问题

嘿,这个问题我之前踩过坑!其实Laravel的withDefault()闭包是支持第二个参数的,这个参数就是关联的父模型(也就是你的Invoice实例),直接用它就能拿到当前发票的email啦!

修改后的关联代码应该是这样的:

class Invoice extends Model {
    /**
     * Get an invoice client.
     */
    public function client() {
        return $this->belongsTo('App\Client', 'email', 'email')->withDefault(function ($client, $invoice) {
            // 这里的$invoice就是当前的Invoice模型实例,直接取它的email赋值给默认Client
            $client->email = $invoice->email;
        });
    }
}

原理很简单:当Laravel找不到关联的Client模型时,会调用这个闭包创建一个默认的Client实例,同时自动把当前的Invoice实例作为第二个参数传递进来。这样你就能在闭包里任意访问主模型的属性了。

如果之后需要给默认Client设置更多字段,也可以用这个$invoice参数,比如:

->withDefault(function ($client, $invoice) {
    $client->email = $invoice->email;
    $client->name = '临时客户 (' . $invoice->email . ')';
});

这样之后你用$invoice->client->email的时候,不管有没有对应的Client数据,都能拿到正确的邮箱值啦!

内容的提问来源于stack exchange,提问作者Alexey Alshenetsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:25:44