【问题标题】:Laravel Querybuilder method with Join is not calling accessor in laravel带有 Join 的 Laravel Query Builder 方法未在 laravel 中调用访问器
【发布时间】:2021-06-26 00:44:38
【问题描述】:

我的查询是这样的

$query = type::select(DB::raw(
                "CONCAT(users.first_name,' ',users.last_name) 
                as full_name"
            ));

    $query->join('users', function ($join) {
                        $join->on('users.id', '=', 'type.uid')
                            ->where('type.is_deleted', 0);
                    })

   return $query->where('type.id', 123)->get();

和用户模型中的访问器方法

public function getFullNameAttribute()
{
    return "{$this->first_name} {$this->last_name}";
}

但它没有调用该方法,也没有返回 fullName 作为输出

【问题讨论】:

  • 这能回答你的问题吗? Laravel: How to get Models out of query results?
  • 你没有使用 Eloquent 来拉取结果。所以你实际上并没有得到模型。您可以使用Model::hydrate() 方法将模型从您的查询中取出
  • @CornelRaiu 我从未使用过 hydrate()。你能帮我怎么用吗?我需要删除 DB::RAW 吗?
  • 看看我在其他评论中添加的链接
  • @CornelRaiu 我已经检查过了,但不知道如何在我的场景中使用

标签: php laravel query-builder


【解决方案1】:

您可以使用Model::hydrate() 方法。 像这样。

我没有测试它,但它应该给你一个先机

$query = App\User::select();
// or $query = DB::table(User::make()->getTable());
// or $query = User::select(['users.id', 'users.first_name', 'users.last_name']);

$query->join('subjects', function ($join) {
    $join->on('users.id', '=', 'type.uid')->where('type.is_deleted', 0);
})

$users = App\User::hydrate($query->where('type.id', 123)->get()->toArray()); 

您需要确保获得访问器所需的列。

【讨论】:

  • 我需要保留CONCAT吗?或者连接将由访问器完成?
  • TypeError: 传递给 Illuminate\Database\Eloquent\Builder::hydrate() 的参数 1 必须是数组类型,对象给出
  • 即使尝试了这个,User::hydrate($data->toArray()),它也没有按预期工作
  • @BhumiShah 我更新了答案。让我知道是否可以。
猜你喜欢
  • 2018-12-21
  • 2014-02-25
  • 2018-10-03
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多