🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

Q&A

解決済

1回答

1273閲覧

チェックボックスで選択した複数の値を配列としてDBに保存したい

sakuta777

総合スコア10

Laravel

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

0グッド

0クリップ

投稿2019/12/19 04:49

現在laravelでグループを作成機能を作っておりまして、グループ作成時にグループに入れたいユーザーを選んでグループを作るという機能を作っています。

グループ作成時にグループに入れたいユーザーの情報を配列にしてgroup_belongカラム(int型)に格納するようにしているのですが、GroupController.phpの$groups->save();
の所でCall to a member function save() on arrayというエラーが出てしまい保存することができません。このエラーについて調べてみたのですが、ほとんど情報がなく困っています。

group_belongの記述を削除し、nameだけの時は保存できたので、
$groups = $request->input('group_belong');
の書き方が怪しいと思っています。

このエラーを解決するにはどうすればよいでしょうか?
(該当コードは下記に添付しています。)

create.blade.php

<h1>グループを作成する</h1> <div class="title-under">グループを作成したいユーザーのチェックボックスをonにしてください。</div> <div class="container"> <form method="post" action="/groups"> {{ csrf_field() }} <div class="row"> @foreach($users as $user) <div class="col-md-4"> <div class="group-user">{{$user->id}}:{{$user->name}} <input type="checkbox" name="group_belong[]" value="{{$user->id}}"></div> </div> @endforeach </div> <div class=" row"> <div class="col-md-6"> <div class="form-group"> <label>グループ名入力</label> <input type="text" class="form-control" name="name"> </div> </div> </div> <input type="submit" value="作成" class="btn btn-primary"> </form> {{ $users->links() }} </div>

GroupController.php

class GroupController extends Controller { public function index() { return view('group.index'); } public function create() { $users = User::orderBy('created_at', 'desc')->paginate(9); return view('group.create', ['users' => $users]); } public function store(Request $request) { $groups = new Group; $groups->name = $request->name; $groups = $request->input('group_belong'); $groups->save(); return redirect('/groups'); } public function invite() { return view('group.invite'); } public function cancel() { return view('group.cancel'); } }

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

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

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

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

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

m.ts10806

2019/12/19 05:04

intに配列が入らないのは当然なので、設計見直す必要があります。 いまどうなっているのでしょう
guest

回答1

0

ベストアンサー

groups変数を上書きしてしまっており、Modelとしての振る舞いが失われています。
groupsのgroup_belongカラムへの値の設定は以下のように書きます。

$groups->group_belong = $request->input('group-belong')

提示されたエラーは上記の修正て直ると思いますが、int型に配列は入れられないのでやはりエラーになるはずです。
テーブル設計の再考が必要になると思います。

投稿2019/12/19 05:37

編集2019/12/19 05:47
katandps

総合スコア13

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

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

sakuta777

2019/12/19 06:05

仰る通りのコードを記述した所今度はArray to string conversion というエラーが発生したのですが、配列と文字列を一緒の$groupsに入れているのが原因ですかね?
katandps

2019/12/19 06:22

エラーメッセージの直接の原因は、EloquentQueryBuilderによるクエリ生成時に、文字列として配列で受け取った入力値を結合したことによるものです。 入力値が複数あり、int型カラムが一つしかないため、nameの値について重複を許すか(正規化の観点から非推奨)、データベーススキーマを変更しない限りエラーは解消できません。
sakuta777

2019/12/19 06:30

返答ありがとうございます。データベーススキーマを変更しようと思っているのですが、 配列を格納できる型はありますかね?group_belongを blobやjsonに変えて試してみたのですが、やはりArray to string conversionと出ました。
katandps

2019/12/19 06:37

jsonで保存する場合、EloquentModelが対応していますので Groupクラス内に以下の記述を追加してみてください。 ``` protected $casts = ['group_belong' => 'json']; ```
sakuta777

2019/12/19 06:48

jsonに変えて、下記記述をした所同じくArray to string conversionと出ました。記述方法が間違っているのですかね? ``` <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Group; use App\User; class GroupController extends Controller { protected $casts = ['group_belong' => 'json']; public function index() { return view('group.index'); } public function create() { $users = User::orderBy('created_at', 'desc')->paginate(9); return view('group.create', ['users' => $users]); } public function store(Request $request) { $groups = new Group; $groups->name = $request->name; $groups->group_belong = $request->input('group_belong'); $groups->save(); return view('group.index'); } public function invite() { return view('group.invite'); } public function cancel() { return view('group.cancel'); } } ```
sakuta777

2019/12/19 06:50

すいません。コントローラーに記述していました。modelですよね。
sakuta777

2019/12/19 06:55

上記をモデルに記述した所, 各ユーザー情報を文字列でデータベースに格納することができました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問