Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何形成一个查询,使查询结果只包含来自laravel中两个单独表的公共值?_Php_Mysql_Laravel_Inner Join - Fatal编程技术网

Php 如何形成一个查询,使查询结果只包含来自laravel中两个单独表的公共值?

Php 如何形成一个查询,使查询结果只包含来自laravel中两个单独表的公共值?,php,mysql,laravel,inner-join,Php,Mysql,Laravel,Inner Join,我们试图在reports to结构中返回结果,其中只显示共享公共值(来自两个单独的数据表)的报告用户 我们正在使用larvel。在控制器中,我们将“报告用户”定义为(来自公共用户表的)用户,他们是活动的,向另一个“用户id”报告,这两个“用户id”共享完全相同的“记分卡类型id”(来自($dbPrefix.'access\u permissions'和$dbPrefix.'scored\u In')。我们已尝试使用内部联接,但出现了错误。这是一个linux服务器,运行MySQL和PHP,在一个高

我们试图在reports to结构中返回结果,其中只显示共享公共值(来自两个单独的数据表)的报告用户

我们正在使用larvel。在控制器中,我们将“报告用户”定义为(来自公共用户表的)用户,他们是活动的,向另一个“用户id”报告,这两个“用户id”共享完全相同的“记分卡类型id”(来自($dbPrefix.'access\u permissions'和$dbPrefix.'scored\u In')。我们已尝试使用内部联接,但出现了错误。这是一个linux服务器,运行MySQL和PHP,在一个高级堆栈下

表中计分卡的图像(使用的列id为:“用户id”和“计分卡类型id”):

访问权限表的图像(使用的列id为:“id”和“分数卡类型id”):

对于Users表:我们引用的Id是“Id”

此场景中使用了三个数据表,一个公共用户表,一个用于计分的前缀数据库表(此表定义了计分卡类型\ id用户的计分),以及一个用于访问权限的前缀数据库表(此表定义了用户可以对其他用户计分的计分卡类型\ id)

我们目前的处境: 你可以在这里看到,老师1可以看到学生2和学生3,但他们不应该在老师2或老师3的课堂上看到学生2和学生3,因为老师1不教学生2或学生3。 我们想要的是:

我们希望用户(教师1)只看到向教师1报到的学生,并且在教师1拥有的访问权限得分卡类型id中得分


我们希望结果是,查看用户只能看到其“scored_in”数据表中的“scored_type_id”的报告用户=访问权限数据表中的查看用户“scored_type_id”。

这很难理解,此代码存在一些问题

首先,您应该使用雄辩的关系()而不是连接

其次,除非有一个报告链,比如
a报告给b,c报告给b,因此c报告给a
,否则您不需要
this->getAllReportingUsers()…
行,因为它会创建不必要的递归。我也不确定您为什么通过引用传递而不返回输出,但我将这留给您

第三,尝试将此作为查询(您可以在不修复上述问题的情况下执行此操作):

它的作用是:

  • 获取所有用户配置文件并将其加入到用户
  • 将记分卡加入用户
  • 将用户访问加入记分卡
  • 过滤掉不活跃的用户
  • 筛选出不向
    $userId报告的用户
  • 筛选出
    $userId
    无权访问记分卡的用户
  • 注意,如果存在共享相同名称的列,您可能会在此处看到一些有趣的行为,因为后面的列名会覆盖联接中较早的列名


    希望我正确理解了您的意思…

    如果是我,我会将应用程序代码放在一边一分钟,然后查看
    function getAllReportingUsers($userId, &$allUsers) {
        $dbPrefix = $this->getDBPrefix(null);
        $user_profiles =  user_profile::join('users', 'users.id', '=', 'user_profile.user_id')
        ->where('users.is_active', '=',  1)
    
        ->where('user_profile.reports_to', '=',  $userId)
    
        // Shit!
        //->select(DB::raw('distinct('.$dbPrefix.'scored_in.score_card_type_id)'))
        //->where($dbPrefix.'scored_in.score_card_type_id', '=', $dbPrefix.'access_permission.score_card_type_id')
    
    
        ->get();
    
        foreach ($user_profiles as  $reportUserId){
    
            $userReportTo_id = $reportUserId->user_id;
    
            if($userReportTo_id == $userId)
    
            {
    
                array_push($allUsers, $userReportTo_id);
    
                return false;
    
            }
    
            if($userReportTo_id>0){
    
                array_push($allUsers, $userReportTo_id);
    
                $this->getAllReportingUsers($userReportTo_id, $allUsers);
    
            }else{
    
                return false;
    
            }
    
    $user_profiles =  user_profile::join('users','users.id','=','user_profile.user_id')
                          ->join('scored_in','scored_in.userId','=','users.id')
                          ->join('access_permissions','access_permissions.score_card_type_id','=','scored_in.score_card_type_id')
                          ->where('users.is_active', '=',  1)
                          ->where('user_profile.reports_to', '=',  $userId)
                          ->where('access_permissions.id', '=', $userId)
                          ->get()