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
相关产品推荐
相关产品推荐

