前言
本文以一個使用者可以有多項任務(Task),一項任務可以有多項子任務為例。
做法
新增 Task 模型的資料表:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | use App\Models\Group;use App\Models\User;
 use Illuminate\Database\Migrations\Migration;
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Support\Facades\Schema;
 
 class CreateTasksTable extends Migration
 {
 
 
 
 
 
 public function up()
 {
 Schema::create('tasks', function (Blueprint $table) {
 $table->id();
 $table->string('name');
 $table->foreignIdFor(Group::class)->nullable()->constrained()->onDelete('cascade');
 $table->foreignIdFor(User::class)->constrained()->onDelete('cascade');
 $table->foreignId('parent_id')->nullable()->constrained('tasks')->onDelete('cascade');
 $table->timestamps();
 });
 }
 
 
 
 
 
 
 public function down()
 {
 Schema::dropIfExists('tasks');
 }
 }
 
 | 
修改 User 模型:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | namespace App\Models;
 use Illuminate\Contracts\Auth\MustVerifyEmail;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Illuminate\Notifications\Notifiable;
 use Laravel\Sanctum\HasApiTokens;
 
 class User extends Authenticatable
 {
 use HasApiTokens, HasFactory, Notifiable;
 
 
 
 
 public function tasks()
 {
 return $this->hasMany(Task::class)->whereNull('parent_id');
 }
 }
 
 | 
新增 Task 模型:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | namespace App\Models;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 
 class Task extends Model
 {
 use HasFactory;
 
 
 public function tasks()
 {
 return $this->hasMany(Task::class, 'parent_id');
 }
 }
 
 | 
找出使用者所有的任務,以及任務的子任務:
| 12
 3
 
 | User::query()->with(['tasks.tasks',
 ])->first();
 
 |