Zap212
@Zap212

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravel Eloquent リレーション継承?ポリモフィックリレーション?

Laravel Eloquentでの、リレーション継承について

リレーションの定義の方法や抽象化について少し迷っており、ご意見いただきたいです。

まず、ベースとなるPrefectureモデルがあるとします。

Prefecture.php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Prefecture extends Model
{

  // 都道府県に属する市区町村を返す
  public function city()
  {
    return hasMany('App\City');
  }

  // 都道府県に属する清掃業者を返す
  public function cleaners()
  {
    return hasMany('App\Cleaner');
  }

  // 都道府県に属する引っ越し業者を返す
  public function movers()
  {
    return hasMany('App\Mover');
  }
}

上記モデルの状態では、ページとしては「北海道の清掃業者一覧」「東京都の引越し業者一覧」などが表示されることを意図としています。

ただ、ここで業者一覧のページでそれぞれ別のコンテンツを表示させたいということになりました。(47都道府県 × 2業者分 = 97種類のコンテンツ)

なので、下記のような実装を行いました。
大元となるPrefectureモデルは本来持つべき市区町村とのリレーションのみ保持し、
各業者でPrefectureモデルを拡張したモデルを作成するようにしました。

Prefecture.php(変更後)
namespace App;

use Illuminate\Database\Eloquent\Model;

class Prefecture extends Model
{
  // 都道府県に属する市区町村を返す
  public function city()
  {
    return hasMany('App\City');
  }
}
CleanerPrefecture.php
namespace App\Cleaner;

use Illuminate\Database\Eloquent\Model;
use App\Prefecture as BasePrefecture;

class CleanerPrefecture extends BasePrefecture
{
  // 都道府県に属する清掃業者を返す
  public function cleaners()
  {
    return hasMany('App\Cleaner');
  }

  // 都道府県ごとのコンテンツを表示する
  public function contents()
  {
    return hasMany('App\Cleaner\Content');
  }
}

ただ、ポリモフィックリレーションなどを用いることでもう少し良いリレーションの書き方ができるのではないかと感じました。

皆様のご意見いただきたいです。
よろしくお願いします。

0
  // 都道府県ごとのコンテンツを表示する
  public function contents()
  {
    return hasMany('App\Cleaner\Content');
  }

ここがよく分かりませんでした。清掃業者の都道府県ごとに複数のコンテンツがあります?

47 x 2 として
・手抜きする
・業者の種類が増える見込みがない
・コンテンツは必須にして確実に 47 x 2 のコンテンツがある状態にしたい
のどれかなら、Prefectureに「清掃業者コンテンツ」と「引越し業者コンテンツ」を持たせます。

柔軟にやるなら、「業者タイプ」を作ってCleanerMoverをまとめて「業者タイプ」「都道府県」を親テーブルに持つ「業者・都道府県別コンテンツ」テーブルを作ります。

1Like

柔軟にやるなら、「業者タイプ」を作ってCleanerとMoverをまとめて「業者タイプ」「都道府県」を親テーブルに持つ「業者・都道府県別コンテンツ」テーブルを作ります。

こちらの実装がなるほどと思いました。
拡張性も意識して、この実装でいこうと思います!

0Like

Your answer might help someone💌