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

标签 php laravel laravel-5 eloquent

我的发票模型中存在与客户模型的BelongsTo关系。两种模型都有一个 email 字段,但 Client 存在时表示详细信息。 以下是我获取列表的方法:

$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 来访问 Invoice 模型属性:

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

但它不适用于急切加载。在这种情况下,您可以使用 optional() 帮助器来完成此操作:

optional($invoice->client)->email ?? $invoice->email

或者您可以创建 an accessor发票模型中:

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

并使用它:

$invoice->anyEmail

关于php - Eloquent:如何在 withDefault() 闭包中访问相关模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250289/

相关文章:

javascript - 当我在浏览器 jquery ajax laravel 中按 "back"按钮时,服务器上的数据不会更新

mysql - Laravel 查询生成器 - 从 MySQL 获取当前时间

php - 如何使用 composer 安装 PHPWord 库

php - Laravel @extends 和 @include

php - 如何将 Eloquent 关系包含到 JSON 转换结果中?

php - 如何将最新的 Bootstrap 版本正确安装到我的 Laravel 5.4 Web 应用程序中?

php - laravel:数据库员工 ID 和姓名为二维码

php - 如何实现类似客户端计算机的 Yahoo/Facebook 特定 Sing-in 密封以保护客户端免受网络钓鱼攻击?

php - 在服务器上安装 PhantomJS

php - HTML、CSS 和 PHP 跨浏览器样式