【问题标题】:Eloquent Where In With Join SubqueryEloquent Where In with Join 子查询
【发布时间】:2017-02-08 16:46:17
【问题描述】:

我正在尝试在 Laravel 5.4 中使用 Eloquent 执行此查询,但我没有让子查询正常运行。这是原始的 SQL 查询:

select * from projects p
        inner join projects_categories pc on p.id = pc.project_id
where pc.name in (select pc.name from projects p
                      inner join projects_categories pc on p.id = pc.project_id
                  where p.id = $project->id) and p.id <> $project->id;

这就是我想要做的:

 Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
        ->whereIn([
            ['projects_categories.name', function ($query) {
            $query->select('projects_categories.name')
                ->from('projects')
                ->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
                ->where('project.id', '=', $project->id);
        }],
            ['projects.id', '<>', $project->id]
        ])
    ->get();

但我总是得到错误:

缺少 Illuminate\Database\Query\Builder::whereIn() 的参数 2。

谁能帮我解决这个问题?非常感谢您的时间和帮助。

【问题讨论】:

    标签: laravel eloquent laravel-5.4


    【解决方案1】:

    试试这个:

    Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
    ->whereIn('projects_categories.name', function($query) use($project) {
        $query->select('projects_categories.name')->from('projects')
        ->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
        ->where('projects.id', '=', $project->id);
    })->where('projects.id', '<>', $project->id)->get();
    

    【讨论】:

      【解决方案2】:

      如果在Project.php 中,您与categorieshasMany 关系,即

      public function categories() 
      {
          return $this->hasMany(Category::class); 
      }
      

      那么你应该能够像这样雄辩地返回关系:

      Project::find($id)->with('categories');
      

      或者如果您已经加载了项目对象

      $project->load('categories');
      

      我会查看 Laravel 文档,因为您发布的连接看起来过于复杂!

      【讨论】:

      • 是的,真正的最佳情况是您如何发表评论,但我需要的是需要查询的非常具体的情况。不管怎样,谢谢你的帮助!!
      • 如果我们不定义relationship和forignkey,这种关系方法是否有效?
      • 在这种情况下,您必须在 Project 模型上定义一个名为 categoories 的关系。如果你没有使用雄辩的关系,那么你并没有真正获得使用 Laravel 框架的主要好处(无论如何我认为)
      猜你喜欢
      • 2016-06-13
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多