以下のようなアプリケーションを考えた時に、orderとactivity_id
, report_id
はどのようにして紐付けて保存しますでしょうか。
- レポート新規作成画面で、
レポート
とレポートに紐付くアクティビティ
が同時に作成できる - レポートは必ず一つ以上のアクティビティを持つ
- レポート機能で使用されるアクティビティには、それぞれ順番(order)がつけられる
- アクティビティは他の機能でも利用され得る
- 他の機能では順番という情報は必ずしも必要にはならない
- テーブルは、
reports
,activities
,activity_report
である
追記
php
1// レポートを作成するユースケース 2class Interactor 3{ 4 public function __construct(ReportRepository $reportRepository) 5 { 6 $this->reportRepository = $reportRepository; 7 } 8 9 public function __invoke(InputData $inputData) 10 { 11 // レポートに紐付けるアクティビティの作成 12 $activities = []; 13 foreach ($inputData->activitiesWithOrder as $activity) { 14 $activities[] = new ActivityWithOrder( 15 new ActivityId() // 新規作成時なので、何も指定できない 16 ... 17 $activity['order'] 18 ); 19 } 20 21 // アクティビティを持つレポートの作成 22 $report = new Report( 23 new ReportId() // 新規作成時なので、何も指定できない 24 ... 25 new Activities($activities) 26 ); 27 28 // 永続化 29 $this->reportRepository->create($report); 30 } 31} 32 33// モデルを永続化するリポジトリ 34class ChildcareDocumentationRepository 35{ 36 public function __construct(ActivityRepository $activityRepository) 37 { 38 $this->activityRepository = $activityRepository; 39 } 40 41 // リポジトリ 42 public function create(Report $report) 43 { 44 // レポートの永続化 45 $daoReport = DaoReport::create([ 46 ... 47 ]); 48 49 foreach ($report->getActivities() as $activity) { 50 // アクティビティの永続化 51 $daoActivityId = $this->activityRepository->create($activity); 52 53 // Activityリポジトリの保存結果で取得されるIDを用いて中間テーブルに保存 54 $daoReport->activities()->attach([ 55 $daoActivityId => $activity->getOrder(), 56 ]); 57 } 58 59 return $daoReport->id; 60 } 61}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/02 00:19 編集