Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本

Posted

技术标签:

【中文标题】Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本【英文标题】:Laravel Eloquent - Select with join where column text like column text from other table 【发布时间】:2019-06-23 12:15:03 【问题描述】:

我想从我的users 表中选择用户,如果他们住在一个城市中,则返回一个布尔值,该城市存在于我数据库中的cities 表中。

问题是,我不能在 users 表中使用城市的 ID,因为我是从外部来源获取用户列表的。

在普通的 SQL 查询中,我会加入城市表 (users.city LIKE cities.name),然后在结果中添加一列,结果为 true false。

但是在我有我的模型User 和我的模型City 的 Laravel eloquent 中这怎么可能。两种模型都有city 列作为文本。 当然,查询应该尽可能高效,我不希望每一行都有单独的查询。

谢谢

【问题讨论】:

“我从外部来源获取用户列表”是什么意思?你得到了他们的 ID 数组吗? 我得到:姓名,地址,城市,... - 在插入时它会自动添加 id(自动递增) 如果你在用户表,主城市中设置一个city_id作为外键,并为城市和用户做关系参考,我会更好。这样你就可以使用 User::has('city',!=,null)。 @LimKeanPhang 我什么时候应该这样做?在插入用户时?但是我需要一个额外的查询来从我的数据库中获取所有城市,以检查 user.ctiy 是否在我的数据库中 - 对吧? 我已经查询了加入表,请查看。您可能需要做一些调整@Mike_NotGuilty 【参考方案1】:
User::join('City','user.city','=','city.name')
->select(user.city,DB::raw('(CASE WHEN user.city <> NULL THEN 1 ELSE 0 END) AS is_user')
  )

【讨论】:

效果很好,我通过DB::getQueryLog() 进行了检查。这只是一个查询。谢谢!【参考方案2】:

在您的用户模型中,您可以添加新的访问器属性

protected $appends = ['lives_in_city'];

public function getLivesInCityAttribute()
    $hasCity = City::where('city', 'like', $this->city)->first();
    return $hasCity? true: false;

现在您的用户对象将具有新字段lives_in_city,它将返回布尔值。

【讨论】:

不要在属性修改器中执行查询。假设他有 20 个用户的集合,他想在表格中输出。简单的foreachlives_in_city 最终会得到20 个额外的查询。 @d3jn 他没有表之间的关系

以上是关于Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 在与其他表连接后从关系中选择字段

如何在laravel eloquent中为左连接表起别名

Laravel Eloquent 匹配连接的所有参数

Laravel - Eloquent 连接

如何使用 eloquent 在 laravel 中编写多个连接

如何使用 Laravel 4 Eloquent 连接列?