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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

9396閲覧

【Laravel】お客様毎にDBスキーマを切り替える方法

wasi300

総合スコア66

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

3クリップ

投稿2017/06/14 10:40

編集2017/06/14 23:56

いつもお世話になっております。Laravelについて質問させてください。
例えば美容室毎に、別スキーマをLarvelで利用する方法はございますでしょうか。

CentOS 6.8
Laravel 5.4
PHP 5.6.3
MariaDB

という環境で、Webアプリの開発を行っております。

##運用想定
Laravelで作成したアプリ1つに対し、美容室毎に別スキーマに接続したいです。
5年でスキーマ数は150になる想定です。

##教えて頂きたいこと
Laravelでアプリ1つに対し、多数のスキーマを利用するのは、一般的なのでしょうか?
グーグルで検索しても、想定する利用スキーマが2つくらいのものしか見つかりませんでした。
もしも利用するとした場合、動的にdatabase.phpに接続先データを自動出力するような事は
Laravelで可能なのでしょうか。

知見のある方がおられましたら、御指南ねがいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

"データベース" と "スキーマ" という単語がごっちゃになっていてよくわからないのですが、Eloquent の1つのモデルで複数のテーブルを切り替えて使いたいということでしょうか?

そうであれば、モデルクラスの $table プロパティに都度テーブル名を指定してあげれば実現できます

php

1class BeautySalon extends Model { 2 // 省略 3} 4 5$salon1 = new BeautySalon(); 6$salon1->table = 'beauty_laravel'; 7$salon1->where('user', 'suzuki')->get(); 8 9$salon2 = new BeautySalon(); 10$salon2->table = 'salon_de_php'; 11$salon2->find(123)->get();

さらに、テーブル指定をコンストラクタに組み込めば多少スマートになります。

php

1class BeautySalon extends Model { 2 public function __construct($table, array $attributes = []){ 3 parent::__construct($attributes); 4 $this->table = $table; 5 } 6} 7 8$salon1 = new BeautySalon('beauty_laravel'); 9$salon1->where('user', 'suzuki')->get(); 10 11$salon2 = new BeautySalon('salon_de_php'); 12$salon2->find(123)->get();

ただ一般的にテーブルを使い分けるというのは基本的にバッドハックです。レコード量が多すぎるのであればデータベースのパーティション機能を使うべきですし、カラム数が多すぎるのであればテーブルを分けてリレーションシップを使うべきです。

上記のサンプルコードのように使っているとバグの温床になりかねませんし、ORMを使う意味が薄れてしまう気がします。

投稿2017/06/14 17:10

編集2017/06/14 17:19
miyahan

総合スコア3095

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

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

wasi300

2017/06/15 00:33

ご回答ありがとうございます。表記のゆれについては訂正しました。お手数おかけしました。 また、コードについても御指南頂き、ありがとうございます。 ただ、モデルの中でテーブルを切り替えたいわけではなくて、 美容院毎に、違うスキーマに接続し、美容院専用のデータの操作がしたいです。 database.phpに接続先を記載し、接続先を設定しているプロパティに対して接続先名を設定すれば、 http://dim5.net/laravel/switching-db-connection-dynamically.html 実現可能なのかなとは思っています。 実現は可能なのですが、スキーマが増えるたびにdatabase.phpに接続先を増やさなければいけないので、正直運用したくはないのですが、美容院毎にスキーマを持てばアプリにバグがあっても、他の美容院の情報が見えないので、スキーマを分けたいと言われてます。 スキーマをアカウント毎に分けてWebシステムを運用するのは一般的なのでしょうか、そうでないのでしょうか、そうでないのであれば、なぜこの運用方法が一般的でないのか知りたいです。知った上で、この運用方法は辞めましょうと言いたいです。 どうしても、Laravelでそういった運用をする場合、接続先をスキーマが増えるたびに、database.phpに増やして行かなければなりません。そうすると行数が物凄く多くなるのと、手動で増やさないといけない問題に対して、いい対処方法が知りたいです。
miyahan

2017/06/15 01:47

顧客ごとに "データベース" を分けたいということですね?結論から言うと一般的ではないです。というより異常だと思います。それをやるとユーザーが100万人いるサイトではBDも100万個作る必要がありパフォーマンスの問題でまともに動作しません。また作るアプリの性質にもよりますが、ユーザーをまたぐ(おすすめのユーザーや記事を表示する、席が空いているレストランを探す等)検索や処理を行うのが大変難しくなります。 セキュリティの観点でみても、検索・表示する対象を間違えるというロジック上のバグは開発の段階で発見・対処できるはずです。一方でSQLインジェクション等、セキュリティ上のバグを悪用された場合、異なるDBに分けても同じ権限でアクセスできてしまえば盗めますので無意味です。 営業さんと美容室が交渉の上で契約し、その美容室ごとのポータルサイト的なものを作るというのであれば、Laravelアプリごと顧客ごとに分けるのが良いと思います。
wasi300

2017/06/15 02:25

丁寧なご回答ありがとうございました。大変参考になりました。 頂いた意見を元に、運用提案者に話をします。
wasi300

2017/06/15 02:49 編集

もし運用するならというところでいうと、database.phpに接続先を追記する必要はなく、.envに設定した接続情報を新しく作成したスキーマに紐づけ、[スキーマ名.テーブル名]でクエリを投げれば、別スキーマの参照は可能でした。これを運用するかどうかは別として、技術検証をしたので一応結果を書き残します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問