はじめまして。もふもふおじさんです。
Laravelのjoin句に指定するテーブルについて、Modelから取得が可能ならばModelで「DB接続先・テーブル名」を一元管理できるじゃん!と思い本記事を執筆することとしました。
結論から申し上げると対応案は思いつきましたが、実際に使うか?と言われたら微妙です。
(コード量が増える + テーブル名直書きの方が直感的で分かりやすい)
以下、参考までに。。
JOIN句のテーブル名をModelから取得しよう
今回、元となるjoin句のサンプルコードは下記の通りです。
# サンプルコード
\App\Models\User::join('consumer.user_boookmark', fn($join) => $join
->on('user.id', '=', 'user_bookmark.user_id')
)
...
上記サンプルをDB接続先指定の有無で対応案を記載します。
DB接続先を指定しない場合
例えば、プロジェクトで1つのDBしか取り扱っていない場合、テーブル名のみの指定で問題ありません。
そこで\Illuminate\Database\Eloquent\ModelのgetTable()を用いることでテーブル名を取得することとします。
# 修正後のサンプルコード
\App\Models\User::join((new \App\Models\UserBookmark)->getTable(), fn($join) => $join
->on('user.id', '=', 'user_bookmark.user_id')
)
...
DB接続先を指定する場合
例えば、プロジェクトで複数のDBを取り扱っている場合、デフォルトのDB以外のテーブルを指定する際には接続先を含めたテーブル名を指定する必要があります。(例: consumer.user_bookmark)
そのため、モデルに新たにgetTableWithConnection()を定義し、その中で\Illuminate\Database\Eloquent\Modelの$this->getConnectionName()およびgetTable()を用いることで「DB接続先.テーブル名」を取得することとします。
・\App\Models\UserBookmark
..
protected $connection = 'consumer';
protected $table = 'user_bookmark';
..
public function getTableWithConnection()
{
return sprintf('%s.%s', $this->getConnectionName(), $this->getTable());
}
# 修正後のサンプルコード
\App\Models\User::join((new \App\Models\UserBookmark)->getTableWithConnection(), fn($join) => $join
->on('user.id', '=', 'user_bookmark.user_id')
)
...