Laravel 5 预加载函数

Laravel 5 Eager loading with a function

我的模型 (WeeshUser) 中有一个功能,如果用户没有名字或姓氏,returns 会发送电子邮件。

// RETURN EMAIL OR NAME
public function nameOrEmail() {
    $return = " - ";
    // Check for first name
    if ($this->first_name) {
        $return = $this->first_name;
        // Add lastname if exists
        if ($this->last_name) {
            $return .= " " . $this->last_name;
        }
    } elseif ($this->last_name) {
        // if only lastname exists
        $return = $this->last_name;
    } else {
        //else return email
        $return = $this->email;
    } 
    return $return;
}

我想在从控制器 ex 急切加载时调用此函数:

$weeshReturn = WeeshShare::with('sender.nameOrEmail')->get();

发件人对象是一个 WeeshUser 对象,如果 运行 这个没有 .nameOrEmail 它 运行 没问题,但是如果 运行 它像这样我得到一个错误

Call to a member function addEagerConstraints() on a non-object

这能做到吗?

您收到此错误是因为 Eloquent 假设 nameOrEmailsender 相关,并期望它与 return Illuminate\Database\Eloquent\Relations\Relation 对象,但是你 return 来自它的字符串。

nameOrEmail 是 sender class 上的一个普通方法,它不会被预先加载,你已经预先加载 sender.

你可以做的是:

$weeshReturn = WeeshShare::with('sender')->get();
$weeshReturn->sender->nameOrEmail();