假设我有一个名为 category 的主表,如下所示: -
|-----------------|
| id | name |
|-----------------|
| 1 | Egg |
|-----------------|
| 2 | Meat |
|-----------------|
| 3 | Fish |
|-----------------|
user_category 表格如下: -
|--------------------------------------|
| id | user_id | category_id |
|--------------------------------------|
| 1 | 1 | 1 |
|--------------------------------------|
| 2 | 1 | 3 |
|--------------------------------------|
当我基于user_id获取时,我希望以这样的方式显示数据: -
|----------------------------------|
| id | name | is_checked |
|-----------------|----------------|
| 1 | Egg | 1 |
|-----------------|----------------|
| 2 | Meat | 0 |
|-----------------|----------------|
| 3 | Fish | 1 |
|-----------------|----------------|
这是因为我想创建一个面板,用户可以看到列表中的所有类别,除了他保存的特定类别之外还带有复选标记。
我试着这样做: -
$categoryData = array();
$categoryList = Category::get();
foreach($categoryList as $cl)
{
$category['id'] = $cl['id'];
$category['name'] = $cl['cname'];
$isSaved = UserCategory::select('id')->where(
array('user_id'=>$user_id, 'category_id' => $cl['id'])->count();
if($isSaved > 0)
{
$category['saved'] = 1;
}
else
{
$category['saved'] = 0;
}
$categoryData[] = $category;
}
还有其他方法,比如通过运行一个单独的mysql查询而不是运行循环来完成整个事情吗?
答案 0 :(得分:0)
您可以看到以下代码来解决问题
$categoryData = Category::leftJoin('user_category', function($join) use ($user_id) {
$join->on('category.id', '=', 'user_category.category_id')
->where('user_category.user_id','=',$user_id);
})
->select('category.id','category.name',
DB::raw('
(CASE
WHEN user_category.id is null THEN 0
ELSE 1
END) as saved'
)
)
->get()
->toArray();