iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1
Software Development

30天完成家庭任務平台系列 第 5

30天完成家庭任務平台:第五天

  • 分享至 

  • xImage
  •  

家庭任務平台中主要使用了使用者,計畫,任務,活動,個人資料這五者的關係分別為

  • 使用者(User):可以創建計畫或者被邀請參加計畫
  • 計畫(Project):可以創建分配的任務
  • 任務(Task):紀錄承擔任務的人
  • 使用者與計畫/任務產生活動(Activity):由於一個專案可以有多個使用者,包含創建或被邀請加入專案中的使用者,所以不同使用者可以對計畫或任務做修改等行為,這些行為紀錄就是該專案的活動
  • 個人資料(Profile):使用者可以上傳自己的大頭照

家庭任務平台中的Model各為:

  1. Model(User):對應資料表(users)
class User extends Authenticatable
{
   use Notifiable;
 
   /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
   protected $fillable = [
       'name', 'email', 'password',
   ];
 
   /**
    * The attributes that should be hidden for arrays.
    *
    * @var array
    */
   protected $hidden = [
       'password', 'remember_token',
   ];
 
   /**
    * The attributes that should be cast to native types.
    *
    * @var array
    */
   protected $casts = [
       'email_verified_at' => 'datetime',
   ];
 
   public function projects()
   {
       return $this->hasMany('App\Project', 'owner_id');
   }
   public function tasks()
   {
       return $this->hasMany('App\Task', 'assignee_id');
   }
   public function profile()
   {
       return $this->hasOne('App\Profile');
   }
   public function getProjects()
   {
      return  Project::where('owner_id', $this->id)
           ->orWherehas('members', function (Builder $query) {
               $query->where('member_id', $this->id);
           })->orderBy('updated_at', 'desc')->get();
      
   }
 
   public function activities()
   {
       return $this->hasMany('App\Activity');
   }
 
   public function invitedProject()
   {
       return $this->belongsToMany('App\Project', 'member_project', 'member_id', 'project_id');
   }
}
  1. Model(Project):對應資料表(projects)
class Project extends Model
{
   use Recordability;
   protected $fillable = ['note', 'title', 'description', 'owner_id'];
 
   public function owner()
   {
       return $this->belongsTo('App\User', 'owner_id');
   }
 
   public function tasks()
   {
       return $this->hasMany('App\Task');
   }
 
 
   public function addTask(array $task)
   {
       $this->tasks()->create($task);
   }
 
   public function activities()
   {
       return $this->morphMany('App\Activity', 'recordable');
   }
   public function members()
   {
       return $this->belongsToMany('App\User','member_project','project_id','member_id');
   }
   public function invite(User $member)
   {
     
       MemberProject::firstOrCreate([
           'member_id'=>$member->id,
           'project_id'=>$this->id
           ]);
 
   }
}

ps. 在app的資料夾中加入trait:Recordability

trait Recordability
{
        
        public function recordActivity(string $description, $changes = [])
   {
       $user_id = $this->activityOwner();
       $this->activities()->create(['user_id'=>$user_id,'description' => $description, 'changes' => $changes]);
   }
 
  protected function activityOwner()
  {
      if(Auth::check()){
          return Auth::id();
      }
      if(class_basename($this) === 'Project'){
       return $this->owner->id;
      }elseif(class_basename($this) === 'Task'){
       return $this->project->owner->id;
      }
         
  }
}

篇幅有點太長了,明天繼續:
Model(Task):對應資料表(tasks)
Model(Activity):對應資料表(activities)
Model(Profile):對應資料表(profiles)
Model(MemberProject):對應資料表(member_project)


上一篇
30天完成家庭任務平台:第四天
下一篇
30天完成家庭任務平台:第六天
系列文
30天完成家庭任務平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言