【问题标题】:Laravel 5.4 custom join (raw sql) mapped to an Eloquent ModelLaravel 5.4 自定义连接(原始 sql)映射到 Eloquent 模型
【发布时间】:2017-04-06 10:08:58
【问题描述】:

谁能告诉我如何将使用 RAW SQL 或查询生成器创建的连接结果映射到 Eloquent 模型?

团队有很多用户,有很多学生,有很多项目

我正在通过子关系加入一个团队的所有项目

例子:

$projects = Project::join('students', 'students.id', '=', 'projects.student_id')
            ->join('users', 'users.id', '=', 'students.user_id')
            ->join('teams', 'teams.id', '=', 'users.team_id')
            ->select('projects.*', 'students.*', 'users.*', 'teams.*')
            ->get();

现在,我如何才能将此处的结果映射到“项目”模型的集合,其中子关系映射了它们各自的模型

  • 学生
  • 用户
  • 团队

【问题讨论】:

    标签: php laravel laravel-5 collections eloquent


    【解决方案1】:

    您不需要使用连接。改用 Eloquent 的预加载。

    如果您在模型中正确定义了关系,以下应该可以解决问题:

    $projects = Project::with('student.user.team')->get();
    foreach($projects as $project) {
        $student = $project->student; //Student model
        $user = $student->user;  // User model
        $team = $user->team;  // Team model
    }
    

    更新: 如果您想获取给定团队的项目,请执行以下操作:

    $projects = Project::with('student.user.team')->whereHas('student.user.team', function($query) use ($teamId) {
      $query->whereId($teamId);
    })->get();
    

    【讨论】:

    • 但是我需要指定团队,有问题,在你的例子中我不能,如果我想做过滤和东西我该怎么做?
    • hasmany through 似乎是一个很好的答案,但它只允许一个中间表,这里我有两个中间表
    • 这里我不需要查询团队我只需要与团队相关的项目
    • 在这里似乎是一个好方法,你能解释一下为什么他们有一个 hasManyThroug 而你的解决方案正好适合这种情况吗?我想知道
    • 加上第二个问题,在某些情况下,我仍然需要为非常复杂的关系进行连接,如果是这种情况,我该如何将其映射到模型?
    猜你喜欢
    • 2018-10-11
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2021-03-22
    • 2010-10-20
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多