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

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

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

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

Laravel 5

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

Q&A

解決済

1回答

3578閲覧

DBからEloquentを使って取り出した結果をtoArray()するとキーの型が変わってしまう

chibi144

総合スコア64

Laravel

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

Laravel 5

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

0グッド

1クリップ

投稿2018/02/19 03:43

編集2018/02/19 06:54

前提・実現したいこと

Laravelを使って、DBから情報を取得したいと考えています。
元のテーブルでは主キー(下の例ではid)はstring型になっていて、
first()したところまではstring型のままなのですが、
toArray()をしたところint型になってしまいました。
どうすればstring型のまま配列に変換できるでしょうか。

該当のソースコード

listController.php

php

1<?php 2 3namespace App\Http\Controllers; 4use Illuminate\Http\Request; 5use App\Models\search; 6use Illuminate\Support\Facades\DB; 7 8class listController extends Controller 9{ 10 public function store(Request $request) 11 { 12 //リクエスト内容 13 $conditions = $request; 14 15 $md = new search(); 16 17 //全画面で入力された内容(例:111-1111) 18 var_dump($request->input); 19 20 switch($request->search_type){ 21 //完全一致検索 22 case 'perfect': 23 $items_arr = $md->Perfect($request->input) 24 //一件のみ取得 25 ->first(); 26 break; 27 //前方一致検索 28 case 'fuzzy': 29 $items_arr = $md->fuzzy($request->input) 30 //全件取得 31 ->get(); 32 break; 33 default: 34 $items_arr = $md; 35 break; 36 } 37 38 //この時点ではstring(例:111-1111) 39 var_dump($items_arr); 40 41 //追記)考え方が根本的に間違っていることに気づいたためコメントアウト。本題には影響ないと考えます。 42 //if ($items_arr !== null) { 43 // $items_arr->Fromconditions($request); 44 //} 45 46 //この時点ではstring(例:111-1111) 47 var_dump($items_arr); 48 49 if ($items_arr !== null) { 50 $items_arr = $items_arr->toArray(); 51 } 52 53 //この時点でintに変わっている(例:111) 54 var_dump($items_arr); 55 56 return view('list/list', 57 compact( 'items_arr' ) 58 ); 59 } 60}

search.php

php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Model; 6 7class search extends Model 8{ 9 protected $table = 'item'; 10 protected $primaryKey = 'id'; 11 12 //完全一致検索 13 public function scopePerfect($query, $input) 14 { 15 return $query->where('id', $input); 16 } 17 18 //前方一致検索 19 public function scopeFuzzy($query, $input) 20 { 21 return $query->where('id', 'like', "$input%"); 22 } 23 24  //追記)完全にミス。絶対動かない 25 //$conditionsの中に$columnsと一致するものがあればSQL文を発行する 26 public function scopeFromconditions($query, $conditions) 27 { 28 //検索対象となるカラム 29 $columns = [ 30 'kind', 'salesStartYear', 'discontinuedYear' 31 ]; 32 33 foreach ($columns as $column) { 34 if (isset($conditions->$column)) { 35 $query->where($column, $conditions->$column); 36 } 37 } 38 return $query; 39 } 40}

補足情報(FW/ツールのバージョンなど)

Laravel 5.6.3
PHP 7.1.8
なお、scopeFromconditionsが正常に動くかどうかはテストできていません。

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

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

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

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

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

m.ts10806

2018/02/19 05:11

例の「111-1111」というのは郵便番号という認識で良いでしょうか。
chibi144

2018/02/19 05:21

郵便番号ではなく商品コードです。途中で-が入ったり最後に半角英字が入ったりするため、文字列で管理しています。また、-の入り方は不規則です。-を詰めた形で管理できないことはないです。
chibi144

2018/02/19 05:22

1111A、111-1111、111-111-1、111-111-AAなど。
guest

回答1

0

自己解決

テーブルのkeyTypeがint(3)になっていた(初期値?)ことが原因でした。

class search extends Model { protected $table = 'item'; protected $primaryKey = 'id'; protected $keyType = 'string'; //これ ...(中略) }

↑のようにすることで解決しました。

投稿2018/02/19 07:42

chibi144

総合スコア64

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問