質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2378閲覧

リクエスト毎に参照するModel名を変更しEloquentを利用したい

larachan

総合スコア28

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/10/12 08:06

編集2021/10/13 06:56

LaravelのModel名をリクエスト毎に動的Model名称でEloquentを利用したいです。

例えばrequest.id=1の場合は

TestModel_1を利用したく、紐づいているテーブルはTestModel_1とします。

request.id=2
TestModel_2を利用したいです。紐づいているテーブルはTestModel_2とします。

テーブル毎にModelファイルを作成するのは馬鹿馬鹿しいので、Modelのphpファイルは1つに纏めたいと思っています。

DBクラスではできましたが、Eloquentで上手くいっておりません。

いい案がある方いましたら教えてください。

Modelのconstructにて

protected $table = 'TestModel'; public function __construct(int $id) { parent::__construct(); $this->table = $this->table. '_'.$id; } public function getTestModel() { return TestModel::all(); }

で試しましたが、

TestModel::query();などで利用する場合
constructにてToo few arguments to functionが発生しエラーになってしまいます。debugで追うとTestModel::all();にて発生します

呼び出し元 $a = new TestModel(id: 1); $a->getTestModel();

よろしくお願いします。

追記

    protected $table = ''; app()->bind(TestModel::class, function () { $tm = new TestModel(); $tm->table = 'test_model_1'; return $classX; }); try { $tm = app()->make(TestModel::class); $table = $tm->table; $a = $tm->getCollectionTpUrgent(); } catch (BindingResolutionException $e) { } return $a;

上記のパターンでは外から$tableは変更されましたが、$tm->getCollectionTpUrgent();で対象テーブルなしのexceptionが発生しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai0310

2021/10/13 00:57

データベース構造を見直されたほうが。。
larachan

2021/10/13 01:24

ありがとうございます。売上データのテーブルを想定してるのですが、idごとにテーブルを分けないと微妙なので、こうしております。日時で100万件くらいの売上データを想定してます。
FKM

2021/10/13 06:07

Too few arguments to functionが発生した場合の記述はどうなっていますか?
larachan

2021/10/13 06:56

追記しました。
m055001

2021/10/13 07:25

具体的な業務ドメインをわかっていないのであれですが、私も個人的にもコードを頑張ってどうこうするより、DB設計を見直されたほうがよい気がします。 idが具体的に業務ドメインの中で何を示しているのか質問から汲み取れませんが、売上データなのであれば商品ごとに属性があると思うので、仮に分けるにしてもその属性ごとのテーブルに分けるようにするとかできるんじゃないかと思いまして、そうなるとテーブル名がidだけで分けられているのは今後の保守性を大きく損ねるんじゃないかと思います。 また、属性とか関わらず単に売上データを入れていくだけなんだとすると、売上データを検索するみたいなことが発生するとしたら、全てのテーブルをjoinする必要が出てくるので、えらいことになりそうなのが想像できます。
larachan

2021/10/13 07:46

ありがとうございます。会社のidごとで分けることを想定しています。会社idごとにテーブルができてしまいますが。。。
m055001

2021/10/13 08:09

id = 会社ごとに割り当てられているidなのですね!ありがとうございます。 全企業合算した一日の売上データが100万件なんですかね? であれば、わけたほうが1テーブルあたりのレコード件数も減るのでいいかもしれないですね。 ただ、個人的にテーブル名はidじゃなくて企業名とかの方がよさそうですね。 (TestModel_24テーブルでエラー出たときに、どの企業かを調べる手間が発生しますし) (あ、でも企業名って変わることもあるからidの方がいいのかなぁ...) 余談ですが https://teratail.com/questions/18942 こちらには100万件ならぎりMySQLでいけそうと書いてますが、可能ならBigQueryやらを使ったほうがよさそうですね。
larachan

2021/10/13 13:45

ありがとうございます。会社名もありですね!参考にさせて頂きます。DBはOracleのAutonomous使う想定ですので、件数によるパフォーマンスは大丈夫と思います!
guest

回答1

0

自己解決

Model内にメソッドを自作し、
TestModel::function('table_2')->でけました。

投稿2021/10/14 08:41

larachan

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問