代码之家  ›  专栏  ›  技术社区  ›  Lynob

如何使用透视表获取记录?

  •  0
  • Lynob  · 技术社区  · 6 年前

    我在任务和用户之间有一个多对多的关系,我试图获得存档的任务,一个存档的任务是:

    • 完成的任务=1
    • 昨天或以前完成的任务,不包括今天完成的任务

    • 用户只能查看他创建或分配的存档任务 如果将用户分配给任务,则其ID将存储在数据透视中。 表

    • 出于问题范围之外的原因,我只能使用下面task.php中所示的透视表来访问用户。

    task.php模型

    public function taskusers(){
    返回$this->hasmany('app\models\tasks\usertask')->其中('role',1);
    }
    

    php模型不包含任何内容,一个空模型

    class usertask extends basemodel_
    < /代码> 
    
    

    迁移

    CreateTaskStable扩展迁移
    {
    受保护的$table='任务';
    受保护的$app_table=true;
    
    
    公共功能向上()
    {
    架构::创建($this->gettable(),函数(蓝图$table){
    $table->增量(“id”);
    $table->字符串(“title”);
    $table->日期时间(“提交日期”);
    $table->datetime('closed_date')->nullable();
    $table->datetime(“到期日”)->nullable();
    $table->tinyinteger('is done')->nullable()->默认值(0);
    $table->integer('domain_id')->unsigned()->nullable();
    $table->foreign('domain_id')->references('id')
    ->打开(self::gettablename('domains'))->OnDelete('cascade');
    $table->biginteger('created_by')->unsigned()->nullable();
    $table->foreign('created_by')->引用('id')
    ->打开(self::gettablename('auth_users',false))->OnDelete('cascade');
    $table->biginteger('closed_by')->unsigned()->nullable();
    $table->foreign('closed_by')->引用('id')
    ->打开(self::gettablename('auth_users',false))->OnDelete('cascade');
    $table->时间戳();
    (});
    
    }
    公共功能下降()
    {
    架构::删除($this->gettable());
    }
    }
    < /代码> 
    
    

    类CreateTaskUserStable扩展迁移
    {
    受保护$table='任务用户';
    受保护的$app_table=true;
    公共功能向上()
    {
    架构::创建($this->gettable(),函数(蓝图$table){
    $table->增量(“id”);
    $table->integer('task_id')->unsigned()->nullable();
    $table->foreign('task_id')->references('id')
    ->打开(self::gettablename(“tasks”))
    ->OnDelete(“层叠”);
    $table->biginteger('user_id')->unsigned()->nullable();
    $table->foreign('user_id')->references('id')
    ->打开(self::gettablename('auth_users',false))。
    ->OnDelete(“层叠”);
    $table->integer('role');
    (});
    }
    公共功能下降()
    {
    架构::删除($this->gettable());
    }
    }
    < /代码> 
    
    

    实际表分别

    <我的代码:

    助手在下面

    public static function getarchived($domainid,$userid)
    {
    任务::其中(“域\id”,$domain id)
    ->何处(“完成”,1)
    ->其中(“关闭日期”,“<”,carbon::today()->startofday())
    
    ->其中(函数($query)使用($userid){
    $query->wherehas('taskUsers',函数($query)使用($userid){
    $query->其中('user_id',$user id);
    (});
    })
    ->或在何处(函数($query)使用($userid){
    $query->其中(“创建人”,$userid);
    })
    -Gt();
    }
    < /代码> 
    
    

    动作:

    公共函数execute()
    {
    $domain id=$this->请求->获取(“域\u id”);
    $userid=\auth::id();
    $tasks=taskshelper::getarchived($domainid,$userid);
    返回$this->响应->状态OK(['tasks'=>$tasks]);
    }
    < /代码> 
    
    

    我只得到一个状态OK,没有结果,tasks数组是空的,尽管我的代码似乎是正确的,表中包含1条应该返回的记录。[答:]

  • 昨天或以前完成的任务,不包括今天完成的任务

  • 用户只能查看他创建或分配的存档任务 如果将用户分配给任务,则其ID将存储在数据透视中。 桌子

  • 由于问题范围之外的原因,我只能使用下面task.php中所示的透视表来访问用户。
  • PHP模型

    public function taskUsers()
    {
        return $this->hasMany('App\Models\Tasks\UserTask')->where('role',1);
    }
    

    php模型不包含任何内容,一个空模型

    class UserTask extends BaseModel { }
    

    迁徙

    class CreateTasksTable extends Migration
    {
        protected $table = 'tasks';
        protected $app_table = true;
    
    
        public function up()
        {
            Schema::create($this->getTable(), function (Blueprint $table) {
                $table->increments('id');
                $table->string('title');
                $table->dateTime('submit_date');
                $table->dateTime('closed_date')->nullable();
                $table->dateTime('due_date')->nullable();
                $table->tinyInteger('is_done')->nullable()->default(0);
                $table->integer('domain_id')->unsigned()->nullable();
                $table->foreign('domain_id')->references('id')
                    ->on(self::getTableName('domains'))->onDelete('cascade');
                $table->bigInteger('created_by')->unsigned()->nullable();
                $table->foreign('created_by')->references('id')
                    ->on(self::getTableName('auth_users', false))->onDelete('cascade');
                $table->bigInteger('closed_by')->unsigned()->nullable();
                $table->foreign('closed_by')->references('id')
                    ->on(self::getTableName('auth_users', false))->onDelete('cascade');
                $table->timestamps();
            });
    
        }
        public function down()
        {
            Schema::drop($this->getTable());
        }
    }
    

    class CreateTaskUsersTable extends Migration
    {
        protected $table = 'task_user';
        protected $app_table = true;
        public function up()
        {
            Schema::create($this->getTable(), function (Blueprint $table) {
                $table->increments('id');
                $table->integer('task_id')->unsigned()->nullable();
                $table->foreign('task_id')->references('id')
                    ->on(self::getTableName('tasks'))
                    ->onDelete('cascade');
                $table->bigInteger('user_id')->unsigned()->nullable();
                $table->foreign('user_id')->references('id')
                    ->on(self::getTableName('auth_users', false))
                    ->onDelete('cascade');
                $table->integer('role');
            });
        }
        public function down()
        {
            Schema::drop($this->getTable());
        }
    }
    

    实际表分别

    enter image description here

    enter image description here

    我的代码:

    助手在下面

        public static function getArchived($domainId, $userId)
        {
            Task::where("domain_id", $domainId)
                ->where("is_done", 1)
                ->where("closed_date", '<', Carbon::today()->startOfDay())
    
                ->where(function ($query) use ($userId) {
                    $query->whereHas('taskUsers', function ($query) use ($userId) {
                        $query->where('user_id', $userId);
                    });
                })
                ->orWhere(function ($query) use ($userId) {
                    $query->where('created_by', $userId);
                })
    ->get();
        }
    

    行动:

    public function execute()
    {
        $domainId = $this->request->get('domain_id');
        $userId = \Auth::id();
        $tasks = TasksHelper::getArchived($domainId,$userId);
        return $this->response->statusOk(['tasks' => $tasks]);
    }
    

    我只得到一个状态OK,没有结果,tasks数组是空的,尽管我的代码似乎是正确的,表中包含1条应该返回的记录。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Paras    6 年前

    你的报税表不见了。 getArchived 方法。此外, orWhere 情况似乎不太对劲。你必须使用 parameter grouping 如果你也需要前三个条件。否则查询将读取 (1 && 2 && 3 && 4) || 5 但是你需要 1 && 2 && 3 && (4 || 5) .

    public static function getArchived($domainId, $userId)
    {
        return Task::where("domain_id", $domainId)
            ->where("is_done", 1)
            ->where("closed_date", '<', Carbon::today()->startOfDay())
    
            ->where(function ($query) use ($userId) {
                $query->whereHas('taskUsers', function ($query) use ($userId) {
                    $query->where('user_id', $userId);
                })->orWhere('created_by', $userId);
            })->get();
    }