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 个用户的集合,他想在表格中输出。简单的foreach
和lives_in_city
最终会得到20 个额外的查询。
@d3jn 他没有表之间的关系以上是关于Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 在与其他表连接后从关系中选择字段