0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】JOIN句のテーブル名をModelから取得する

Last updated at Posted at 2023-04-12

はじめまして。もふもふおじさんです。

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')
    )
    ...
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?