書籍「Laravelの教科書」Laravel13対応サポートガイド公開中 → ダウンロードはこちら

LaravelにGoogleチャートを使って円グラフとリアルタイム投票機能を搭載する方法

Laravelと連携:Excel・PDF・Google

LaravelとGoogleグラフを組み合わせて、投票機能付きの円グラフを表示する方法を解説します。

投票した結果は、リアルタイムで円グラフに反映できます。

実際のサイトは、こちらをご覧ください。

ソースはGitHubに公開しているので、記事だけでは分からないときは参考にしてください。

「好きなお団子の種類」の統計結果を円グラフで表示しています。

よかったら実際に好きなお団子に投票をして、円グラフの変化を見てみてくださいね。

じゅんこ
じゅんこ

ちなみに わたしは断然、あんこのお団子が好きです♪

LaravelにGoogleグラフを使って円グラフと投票機能を搭載する方法

それでは手順を解説していきます。

次の順番で進めていきます。

  1. Laravelプロジェクト作成
  2. モデル・マイグレーションの作成と設定
  3. データの挿入
  4. ルート設定
  5. コントローラーの作成と設定
  6. Googleグラフ機能を搭載
  7. Google円グラフの表示を変更
  8. 投票機能を追加

①Laravelプロジェクト作成

新規プロジェクトを作成します。

composer create-project --prefer-dist laravel/laravel test

Laravelのプロジェクトをはじめて作成する場合は、こちらの記事が参考になります。

②モデル・マイグレーションの作成と設定

モデルファイルを作成します。

php artisan make:model Dango -m

database/migrationsフォルダの中に新しくできたファイルを開きます。

下記のように入力し、保存します。

【migrationファイル】

    public function up()
    {
        Schema::create('dangos', function (Blueprint $table) {
            $table->id();
            $table->string('dango');
            $table->integer('number');
            $table->timestamps();
        });
    }

最後に マイグレートを実行します。

php artisan migrate

③データの挿入

作成したお団子テーブルに値を追加しておきましょう。

phpMyAdminにログインし、dangosテーブルの挿入タブをクリック。

お団子の種類と個数を適当に入力しておきます。

みたらし・きなこ・しょうゆ・あんこ の4つのお団子を登録しておきます。

じゅんこ
じゅんこ

データの内容は、お好みに応じて変更してくださいね。

④ルート設定

円グラフ表示用と、投稿結果保存用のふたつのルートを用意します。

routes/web.phpに、下記2行を追加します。

【web.php】

Route::get('/dango/chart', 'DangoController@chart')->name('dango.chart');
Route::put('/dango/vote', 'DangoController@vote')->name('dango.vote');

⑤コントローラーの作成と設定

コントローラーを作成します。

 php artisan make:controller DangoController

app/Http/Controllersの中に新たにDangoController.phpファイルができます。

ファイルを開き、最初にuse宣言を登録しておきます。

【DangoController.php】

use App\Models\Dango;

また、chartメソッドとvoteメソッドを登録しておきます。

class DangoController extends Controller
{
    // チャート表示用
    public function chart(){
        $dangos=Dango::all();
        return view('vote.dangovote', compact('dangos'));
    }

    // 投票結果をデータベースに保存用
    public function vote(Request $request){
        $favorite=Dango::where('dango', $request->dango)->first();
        $favorite->number++;
        $favorite->update();

        return back();
    }
}
コードの意味
◆chartメソッドでは、データベースのお団子のデータをすべて$dangosに代入し、ビューに受け渡しています。ビューファイルは、voteフォルダのなかのdangovote.blade.phpファイルを表示します。◆voteメソッドでは、フォームから送信されたお団子の種類をデータベースから取得。このお団子の種類の数をひとつ増やして、データベースを保存という処理を行っています。

⑥Googleグラフ機能を搭載

次にビューファイルを処理していきます。

ここからは、いよいよGoogleグラフ機能を使っていきます。

まずはresources/viewsの中にvoteフォルダを作成。

さらに、その中にdangovote.blade.phpファイルを作成します。

dangovote.blade.phpファイルの中身は、下記のようにします。

【dangovote.blade.php】

<html>
	<head>
		<script src="https://www.gstatic.com/charts/loader.js"></script>
	</head>
	<title>
		お団子投票結果
	</title>
</head>
<body>

<div id="chart" style="height:500px;width:800px;"></div>


<script>
	google.charts.load('current', {packages: ['corechart']});
	google.charts.setOnLoadCallback(drawChart);

	function drawChart(){

		var data=google.visualization.arrayToDataTable([
			['dango name', 'number'],

				@php
					foreach($dangos as $dango){
						echo "['".$dango->dango."', ".$dango->number."],";
					}
				@endphp
		]);

		var options ={
			title: '好きなお団子統計',
			is3D: true,
		};

		var chart = new google.visualization.PieChart(document.getElementById('chart'));

		chart.draw(data, options);
	}
</script>	
</body>

以上で設定完了です!

円グラフを表示させてみてください。

⑦Google円グラフの表示を変更

なお、円グラフの表示は var options の中身を変更したり、項目を追加すれば、色々と変えられます。

便利な設定をいくつかご紹介しておきますね。

【Google pieChartオプション設定】

円グラフを3D表示にしない is3D: false
ラベル不要 legend: ‘none’,
パイ(円グラフ)の中にラベルをつける pieSliceText: ‘label’,
パイの中に数字と項目を両方入れる legend: {
position: ‘labeled’
},
ラベルを左側につける legend: {
position: ‘left’
},

オプションについては、Googleの公式マニュアルが参考になります。

⑧投票機能を追加

最後に投票機能をつけていきましょう。

dangovote.blade.phpファイル内に、下記フォームを作成します。

【dangovote.blade.php】

	<form method="post" action="{{route('dango.vote')}}">
		@csrf
		@method('put')
			<div class="form-check">
				<input name="dango" value="みたらし" type="radio">
				<label class="form-check-label" for="みたらし">みたらし</label>
			</div>
			<div class="form-check">
				<input name="dango" value="きなこ" type="radio">
				<label class="form-check-label" for="きなこ">きなこ</label>
			</div>
			<div class="form-check">
				<input name="dango" value="しょうゆ" type="radio">
				<label class="form-check-label" for="しょうゆ">しょうゆ</label>
			</div>
			<div class="form-check">
				<input name="dango" value="あんこ" type="radio">
				<label class="form-check-label" for="あんこ">あんこ</label>
			</div>
			<div class="text-right">
			<button type=”submit” class="btn btn-danger btn-primary">投票する</button>
		</div>
		</form>

これで、投票機能の完成です。

記事の最初でも紹介しましたが、こちらが完成したページのサンプルになります。

もしうまくいかない場合は、Google ChromeであればF12を押してデベロッパーツールを起動させて、エラーメッセージをチェックしてみてください。

じゅんこ
じゅんこ

わたしは最初、 visualization をスペルミスしてエラーになりました。

細かい部分で間違いがないか、確認してくださいね。

Laravelと他のツールの連携は、関連記事でも色々と紹介しているので、ご活用ください。

Laravelと連携:Excel・PDF・Google

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる
 

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新版Laravel13への対応に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

最新のLaravel13に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

Laravelの本を書きました。


ひつじが目印♪

Laravelの使い方を分かりやすく解説した本を書きました。 書店やAmazon等のオンラインショップにて販売中
最新版Laravel13対応用サポートガイド(PDF)あり

書籍の詳細を見てみる

Laravelの本書きました。


ひつじが目印♪
クリックするとamazonページへ。
最新版Laravel13対応用
サポートガイド(PDF)あり

書籍の詳細を見てみる
シェアする
Twitter始めました。

コメント

  1. いろは坂 より:

    とてもわかりやすくて参考になりました!
    自分も勉強のため投票サイトを作りたいんですが苦戦しています。
    junkoさんが投票サイトを団子だけに限定しないと考えて様々な投票を行えるようにしたとき、
    カラムをid,dango,numberではなくid,choice1,number1,choice2,number2,…という風に変えたとします。
    そのとき、public function vote()の中をどのように書き換えますか…?
    すいません、自分がわかってないところを丸投げするだけの質問になってしまっています。もし、お時間があればぜひ教えていただけると幸いです。

    • Junko Junko より:

      いろは坂さん、

      コメントありがとうございます。

      データベースのカラムを増やしたい、ということで、複数のカテゴリに問いに対する回答を保存したいのですよね。
      回答としては、カラムは追加しないほうが良いかと思います。

      今のデータベースの状態は、こんな感じです。
      dango: みたらし、number: 3
      dango: きなこ、number: 2
      dango: あんこ、number: 4

      一つのレコード(記録)には、dangoの種別とその数を保存しています。
      ここに他の項目と数字を加えると、管理が難しくなります。

      なのでカラムを増やさず、もうひとつ別のテーブルを作って、別々に処理・表示させるほうが良いかなと思います!

      • いろは坂 より:

        お返事ありがとうございます。

        いきなり管理が難しくなることより、わかりやすく設計できるように頑張ろうと思います!

        重ねて質問になってしまうんですけど、独学で学んでいるので実際のデータベース管理の経験がないので素人質問で恐縮です。
        最終的に大規模な投票サイトにしようと思った時、1つのレコードに選択肢と数を保存する方法で、テーブルが数1000〜数万あるというのは現実的なのでしょうか…?

        • Junko Junko より:

          そうですね。テーブル(表の数)という意味ですと多すぎるかなと^^;

          そうではなく、ひとつのテーブルにまとめるのも手ですね。

          先ほどは別のテーブルにしたほうが良いと書きましたが、
          大規模なサイトを作る前提ですと、他の方法もアリです。

          例えば、先ほどいろは坂さんのおっしゃっていた、
          id, choice1, number1, choice2, ….,
          とする代わりに、
          id, category, choice, number
          のように、カテゴリを追加して、
          カテゴリごとに結果をまとめる方法が考えられます。

          なおテーブルではなく、レコード数であれば、数万あっても全く問題ありません。

  2. いろは坂 より:

    お返事ありがとうございます。

    なるほど…。
    たしかにそういう方法もできそうですね…!
    自分にできるかわからないですがやってみます!

    あろがとうございました。

タイトルとURLをコピーしました