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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Laravel 5

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

Q&A

解決済

5回答

7526閲覧

Laravel データベースから取り出した値をjavascriptに配列で渡す

memimemi

総合スコア25

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Laravel 5

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

0グッド

1クリップ

投稿2019/05/26 03:57

編集2019/05/26 12:29

いつもご回答いただきありがとうございます。
おかげさまで勉強捗ってます!

前提・実現したいこと

laravelを使用してコントローラーでモデルから配列データを取り出し、
ビューに渡してビューからjqueryに配列で渡し、セレクトボックスの一括選択ボタンを作成したいと考えています。

jquery_multiselect.jsの配布サイト

試したこと

2つのテーブルがあります。
![users
roles

controller

1 $users = User::all(); 2 $select1 = $users->where('role_id',1); 3 4 return view('app.show' , $select1);

view

1 <a href="javascript:void(0);" id='select1'>営業</a>

jqeury

1 $('#select1').click(function(){ 2 const data = @json($select1); 3 $('#optgroup').multiSelect('select', select1); 4 return false; 5 });

プラグインの表示のソースは割愛しています。

出たエラー

array_merge(): Argument #1 is not an array

望んでいること

jqueryに渡した時に、role_idが1のユーザーのidを配列で以下のように挿入したい。
営業ボタンを押すと、userテーブルで営業の人を一括選択したいです。
左にはユーザー全体が表示され、右に反映される

jquery

1$('#select1').click(function(){ 2 const data = @json($select1); 3 $('#optgroup').multiSelect('select', ['1', '2',]); 4 return false; 5});

以上です。わかりづらいところあれば補足しますのでよろしくおねがいします

追記 (21:21現在)

コントローラーを以下に修正しました。

controller

1$select1 = DB::table('users')->select('id')->where('role_id', '1')->get()->pluck('id')->toArray(); 2 3return view('app.show' , compact('select1'));

ビューのbody内に以下の記述を追加しました。

view

1 <script> 2 var select1 = "@json($select1)"; 3 </script>

javascript

1$('#select1').click(function(){ 2 $select1 = select1.split(",", -1); 3 $('#optgroup').multiSelect('select', $select1); 4 return false; 5});

この記述で、ボタンを押すとセレクトボックス内にデータが反映されました!
と見えましたが、一番始めと最後の値が反映されておらず変数の中身を見てみると、
["[33", "10", "2", "5", "55", "44", "66]"]
のようになっており、33と66のidは反映されず飛ばされているみたいです。

reprace("[", "")等で消せるかと思って試してみたのですが治らず・・・

後少しなのでご存知でしたらご教授頂けませんでしょうか

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

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

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

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

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

m.ts10806

2019/05/26 04:11

array_merge()はどこでしょうか。今回提示された中にはないような。
memimemi

2019/05/26 04:15

表記したコードをそのまま書いて、viewを表示しようとするとこのエラーがでてきてしまいます。
m.ts10806

2019/05/26 04:17

エラーの意味自体は把握されてますか?
memimemi

2019/05/26 04:20

調べてみた所、array_merge()がないというエラーだというところはわかったのですが、 /vendor/laravel/framework/src/Illuminate/View/Factory.php $data = array_merge($mergeData, $this->parseData($data)); ということで今回のコードとは関係ないところなのかなと思いまして・・・
m.ts10806

2019/05/26 04:22

いえ、array_merge(PHPの標準関数です)に渡すパラメータは2つで、2つとも配列でないといけないのですが、1つ目が配列ではないというエラーです。おそらく文字列がわたってるんでないかと
takepan1973

2019/05/26 04:24

「array_merge()がないというエラーだというところはわかった」 どこをどう読んだらそういう解釈ができるんですか? 配列と配列をマージするにも関数なのにも関わらず、1番目の引数が配列じゃない、でしょう? $mergeData の内容を確認してください。
memimemi

2019/05/26 04:40 編集

>mts10806様 ご丁寧にありがとうございます。 tinkerで調べてみた所たしかに文字列でした。 追記で変更したコードを記入します、まだエラーが出るのですが少し解決に近づけたかと・・・ >takepan1973様 エラーメッセージそのままぐぐってたどり着いたページで間違った解釈をしてしまいました。 arrya_merge()で調べるとphpの配列後ろに配列をくっつける関数と確かに書いておりました。 現在内容を確認中です
m.ts10806

2019/05/26 04:41

意味訳だけならGoogle翻訳でじゅうぶんだったりします。
guest

回答5

0

ベストアンサー

解説してくと
array_mergeはviewヘルパ関数の第二引数に配列じゃないもの(今回だとCollectionかな)を入れた事によって発生します。
viewに渡すものをtoArrayしていますが、この場合viewで参照参照するには $0という感じになってしまうのでまずいです。

Laravel的には下記2パターンの書き方が一般的で、後者の方がよくつかわれます;

return view('app.show' , ['select1' => $select1]);
return view('app.show' , compact('select1'));

この状態で

@json($select1)
で動くと思いますよ

--

追記部分の [{"id":1},{"id":2}] について

$select1 = DB::table('users')->select('id')->where('role_id', '1')->get()->pluck('id')->toArray(); `` としてみてください。pluckについてはドキュメントよんでください

投稿2019/05/26 07:57

編集2019/05/26 08:02
mikkame

総合スコア5036

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

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

memimemi

2019/05/26 12:21

回答有り難うございます。 compactの書き方は知りませんでした、今後使ってみます。 また、アドバイスの記述で無事習得したい値([1,2])が取得できました!! ですが、jqueryに渡した時に別の問題が出てきてしまい、解決方法を探しているところです。
mikkame

2019/05/26 13:12

確認ありがとうございます。 追記についてですが var select1 = @json($select1); このように書けば良いかと思います。 ""で囲われているので文字列として扱われているのではないかと思います。
memimemi

2019/05/26 13:48

その書き方ですと、console.log($select1);で確認するとコンソールでエラーが出てしまいました。 なので""で囲って文字列で渡して、.split(",", -1)で区切るというやり方が一番求めてる回答に近い 表示の仕方をするのですがそれが正しい方法に近づいているのかはわかりません…w
mikkame

2019/05/26 14:14

なんてコンソールにエラーでますか? > なので""で囲って文字列で渡して、.split(",", -1)で区切るというやり方が一番求めてる回答に近い 表示の仕方をするのですがそれが正しい方法に近づいているのかはわかりません…w この方法は現場的によろしくないと思います
mikkame

2019/05/26 14:16

console.log($select1); ではなく console.log(select1); が正しそうですが。
memimemi

2019/05/26 14:25

$select1が存在しませんとのことで、select1にすると無事表示されました。 [33, 10, 26]と表示されていて、本来ライブラリのサンプルのjavascriptの方は multiSelect('select', ["1","2","3"]);のようにセレクトボタンのvalueを選択するので ""で囲った、["33","10","26"]のように文字列のデータを渡してあげないといけないとだめなのかもしれないです。
mikkame

2019/05/26 14:37

おそらく、文字データでも数字データでもこの場合は関係ないと思いますが 現状ですと他にうまくいかない状態ですか? もし、まだうまくいかないようでしたら 取り敢えず、@jsonなどのlaravel由来のものを外してjsだけでうまく動くか検証してみてください
memimemi

2019/05/26 15:09

アドバイスの物チャレンジしたら、解決のきざしにつながりました。 ありがとうございました!
guest

0

ビューの方で、
<script>
var select1 = @json($select1);
</script>

で配列を渡し、javascriptの方で

$('#select1').click(function(){
var num = String(select1);
ary = num.split(',');
$('#optgroup').multiSelect('select', ary);
return false;
});

こうすれば望みの表示ができました!

投稿2019/05/26 15:08

memimemi

総合スコア25

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

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

0

ビューの方で、
<script>
var select1 = @json($select1);
</script>

で配列を渡し、javascriptの方で

$('#select1').click(function(){
var num = String(select1);
ary = num.split(',');
$('#optgroup').multiSelect('select', ary);
return false;
});

こうすれば望みの表示ができました!

投稿2019/05/26 15:07

memimemi

総合スコア25

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

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

0

Laravel(バックエンド)からJavascript(フロントエンド)にデータを受け渡す際は、
window変数を使って(namespaceとしてまとめる変数名の設定可能)以下のライブラリも扱いやすいので利用を検討してみてください。
spatie/laravel-blade-javascript

投稿2019/05/26 05:22

aro10

総合スコア4106

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

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

memimemi

2019/05/26 07:06

aro10さん、いつもありがとうございます。 そのようなライブラリがあるのですね、今解決しているやり方でクリア出来ない場合は 試してみます!
guest

0

エラーがある時点で何が影響するかわからないのです。
たぶん@json()が受け取った値をfactoryで処理してるんではないかと。
となると大雑把な解釈だと$select1が配列になってないという解釈もできます。
view側でdd()で$select1を確認してみてください。

追記。
PHPとSQLの基本的なところをおさえてもらったほうがいいかなというとのと
Laravelのマニュアル読んでもらいたいなというのがありますが、
wherではなくwhereです。
修正前のコードは$select1 = $users->where('role_id',1);とちゃんと書けてますので
落ち着いて対応しましょう。

投稿2019/05/26 04:34

編集2019/05/26 05:14
m.ts10806

総合スコア80765

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

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

memimemi

2019/05/26 05:22 編集

ご丁寧にありがとうございます。 アプリを作りながら勉強も一緒にやっていて、膨大な学習量にまだ知識が追いついてない状況です。 ドキュメントもしっかり理解出来るよう読み進めています。 誤字のご指摘ありがとうございます。 最終的に、$select1 = DB::table('users')->select('id')->where('role_id', '1')->get(); というふうに書き直して、 dd()で確認すると 0 => {#2975 +"id": 1} というふうに希望の番号が習得出来ています。 しかしながら、array_merge()が再度出現してしまいましたのでカラム名の部分がだめなのかなと思っていますが違うでしょうか
m.ts10806

2019/05/26 05:28

配列ではなくオブジェクトになってますね。
memimemi

2019/05/26 07:08

配列とオブジェクトの違い、曖昧でした。 $select1->toArray();で配列になっているでしょうか。 追記で現在の状況をまとめました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問