diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 1f2eef3d..c2336621 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -660,7 +660,7 @@ class ProjectController extends AbstractController { User::auth(); // - $builder = ProjectTask::select(ProjectTask::taskSelect)->with(['taskUser', 'taskTag']); + $builder = ProjectTask::with(['taskUser', 'taskTag']); // $parent_id = intval(Request::input('parent_id')); $project_id = intval(Request::input('project_id')); @@ -672,12 +672,12 @@ class ProjectController extends AbstractController // if ($parent_id > 0) { ProjectTask::userTask($parent_id); - $builder->leftData()->where('project_tasks.parent_id', $parent_id); + $builder->ownerData()->where('project_tasks.parent_id', $parent_id); } elseif ($project_id > 0) { Project::userProject($project_id); - $builder->leftData()->where('project_tasks.project_id', $project_id); + $builder->ownerData()->where('project_tasks.project_id', $project_id); } else { - $builder->authData(); + $builder->joinData(); } // if ($name) { diff --git a/app/Models/Project.php b/app/Models/Project.php index 246b5b96..bf84e92b 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -85,7 +85,7 @@ class Project extends AbstractModel $this->appendattrs['task_complete'] = $builder->whereNotNull('complete_at')->count(); $this->appendattrs['task_percent'] = $this->appendattrs['task_num'] ? intval($this->appendattrs['task_complete'] / $this->appendattrs['task_num'] * 100) : 0; // - $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->authData(User::userid(), true)->whereNull('archived_at'); + $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->authData(User::userid())->whereNull('archived_at'); $this->appendattrs['task_my_num'] = $builder->count(); $this->appendattrs['task_my_complete'] = $builder->whereNotNull('complete_at')->count(); $this->appendattrs['task_my_percent'] = $this->appendattrs['task_my_num'] ? intval($this->appendattrs['task_my_complete'] / $this->appendattrs['task_my_num'] * 100) : 0; diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index ee5fdb52..6f308a11 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -54,8 +54,9 @@ use Request; * @property-read int|null $task_tag_count * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskUser[] $taskUser * @property-read int|null $task_user_count - * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask authData($userid = null, $owner = false) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask leftData($userid = null) + * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask authData($userid = null) + * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask joinData($userid = null) + * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask ownerData($userid = null) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask betweenTime($start, $end) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() @@ -256,37 +257,64 @@ class ProjectTask extends AbstractModel } /** - * 查询自己的任务 + * 查询自己负责的任务 * @param self $query * @param null $userid - * @param bool $owner * @return self */ - public function scopeAuthData($query, $userid = null, $owner = false) + public function scopeAuthData($query, $userid = null) { $userid = $userid ?: User::userid(); - $query->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') - ->where('project_task_users.userid', $userid); - if ($owner) { - $query->where('project_task_users.owner', 1); - } + $query->whereIn('id', function ($qy) use ($userid) { + $qy->select('task_pid')->from('project_task_users')->where('userid', $userid)->where('owner', 1); + }); return $query; } /** - * 查询自己的任务 + * 查询自己参与的任务 * @param self $query * @param null $userid * @return self */ - public function scopeLeftData($query, $userid = null) + public function scopeJoinData($query, $userid = null) { + DB::statement("SET SQL_MODE=''"); + $pre = DB::connection()->getTablePrefix(); $userid = $userid ?: User::userid(); - $query->leftJoin('project_task_users', function ($leftJoin) use ($userid) { - $leftJoin - ->on('project_task_users.userid', '=', DB::raw($userid)) - ->on('project_tasks.id', '=', 'project_task_users.task_id'); - }); + $query + ->select([ + 'project_tasks.*', + DB::raw("MAX({$pre}project_task_users.owner) as owner") + ]) + ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') + ->where('project_task_users.userid', $userid) + ->groupBy('project_tasks.id'); + return $query; + } + + /** + * 查询自己参与的任务(参与条件非必须) + * @param self $query + * @param null $userid + * @return self + */ + public function scopeOwnerData($query, $userid = null) + { + DB::statement("SET SQL_MODE=''"); + $pre = DB::connection()->getTablePrefix(); + $userid = $userid ?: User::userid(); + $query + ->select([ + 'project_tasks.*', + DB::raw("MAX({$pre}project_task_users.owner) as owner") + ]) + ->leftJoin('project_task_users', function ($leftJoin) use ($userid) { + $leftJoin + ->on('project_task_users.userid', '=', DB::raw($userid)) + ->on('project_tasks.id', '=', 'project_task_users.task_id'); + }) + ->groupBy('project_tasks.id'); return $query; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5bc..af59bd2a 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -23,6 +23,14 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + \Illuminate\Database\Query\Builder::macro('rawSql', function(){ + return array_reduce($this->getBindings(), function($sql, $binding){ + return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1); + }, $this->toSql()); + }); + + \Illuminate\Database\Eloquent\Builder::macro('rawSql', function(){ + return ($this->getQuery()->rawSql()); + }); } }