首页 > 解决方案 > 从连接的表中获取结果

问题描述

在我的 laravel 应用程序中,我在不同的表中跟踪课程注册和活动订阅。

一个课程由课程类型表定义,该表具有如下列:

lesson_types
id | name | sub_plan

Enrollemnts 是在登记表中定义的,其列如下:

enrolls
id | user_id | lesson_type_id

我的订阅表有这样的列:

subscriptions
id | name | sub_plan | user_id

表是这样连接的:

表中的示例数据库数据:

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');

但我需要在没有订阅的情况下获得它们......

我想要实现的是:

  1. 获取用户订阅的所有“课程类型”名称
  2. 获取用户已注册但未订阅的所有“课程类型”名称
  3. 获取用户未注册的所有“课程类型”

标签: phplaraveleloquent

解决方案


你可以使用 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 雄辩的关系

遵循这种方法。将其作为最佳实践


推荐阅读