php - 从连接的表中获取结果
问题描述
在我的 laravel 应用程序中,我在不同的表中跟踪课程注册和活动订阅。
一个课程由课程类型表定义,该表具有如下列:
lesson_types
id | name | sub_plan
Enrollemnts 是在登记表中定义的,其列如下:
enrolls
id | user_id | lesson_type_id
我的订阅表有这样的列:
subscriptions
id | name | sub_plan | user_id
表是这样连接的:
- 注册有“lesson_type_id”,它是 course_types 表的“id”
- course_types 中的 sub_plan 列与订阅中的 sub_plan 相同
表中的示例数据库数据:
ennrolls
id user_id lesson_type_id
1 1 1
2 1 2
3 2 1
lesson_types
id name sub_plan
1 Lesson 1 plan_1337
2 Lesson 2 plan_1338
3 Lesson 3 plan_1339
subscriptions
id name sub_plan user_id
1 Sub 1 plan_1337 1
我试图像这样获得所有注册:
$enrolled = DB::table('enrolls')->where('user_id', $userId)
->leftJoin('lesson_types', 'id', '=', 'lesson_type_id')
->select('name');
但我需要在没有订阅的情况下获得它们......
我想要实现的是:
- 获取用户订阅的所有“课程类型”名称
- 获取用户已注册但未订阅的所有“课程类型”名称
- 获取用户未注册的所有“课程类型”
解决方案
你可以使用 Laravel Eloquent 实现上述场景。Laravel 促进了更多内置的 ORM 方法。所以我们不需要手动编写 SQL 代码。不要重新发明轮子
注册模型
namespace App;
use App\User;
use App\LessonType;
use App\Subscription;
use Illuminate\Database\Eloquent\Model;
/**
*
*/
class Enroll extends Model
{
public function lessonType()
{
return $this->belongsTo(LessonType::class);
}
public function users()
{
return $this->hasMany(User::class);
}
}
课程类型模型
namespace App;
use App\Enroll;
use App\Subscription;
use Illuminate\Database\Eloquent\Model;
/**
*
*/
class LessonType extends Model
{
public function enrolls()
{
return $this->hasMany(Enroll::class);
}
public function subscription()
{
return $this->belongsTo(Subscription::class, 'sub_plan','sub_plan');
}
}
订阅模式
namespace App;
use App\User;
use App\LessonType;
use Illuminate\Database\Eloquent\Model;
/**
*
*/
class Subscription extends Model
{
public function lessonType()
{
return $this->hasMany(LessonType::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
在控制器或存储库中
LessonType::select('name')->has('subscription.user');
LessonType::select('name')->doesntHave('subscription.user');
LessonType::select('name')->doesntHave('enrolls.users');
仅供参考: Laravel 雄辩的关系
遵循这种方法。将其作为最佳实践
推荐阅读
- python-3.x - 按短长短的顺序对字符串进行排序
- python - 代码跳过 Python 中的命令。谁能告诉我为什么?
- linux - 如何在 v1 和 v2 之间映射 cgroup freezer 接口文件?
- android - 如何在自定义 WebViewClient 中获取 WebView 对象?
- javascript - Nuxt.js:自动为所有组件添加插件
- python - 获取指定时区的日期时间,与计算机中设置的日期时间无关
- vue.js - Vue安装问题
- reactjs - 如何使用
如果你有 介于两者之间 ? - linux - 使用支持阅读的功能启动 Arch 卡住失败 (-16)
- prometheus - 如何使用 480s * [1,2,3,4,5,6] 获得多个即时向量?