toArray()したら型が変換された話

# 結論
keyTypeはちゃんと設定しましょう。

# 流れ
## 前提
前画面で入力された品番の情報をDBから取得したい。
品番(id)のテーブル上での設定はvarchar(20)。
既存のテーブルを使ったため、マイグレーションは未設定。

##発生した問題
get()まではstring型なのに、toArrayをしたらint型になっている。

## 問題のコード
入力された品番は111-111とする。

```php:listController.php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\search;

class listController extends Controller
{
    public function store(Request $request)
    {
        //検索対象となるカラム
        $searchedColumns = [
            'kind', 'salesStartYear', 'discontinuedYear'
        ];

        //入力された文字列の処理
        $md = new search();
        switch($request->search_type){
            //完全一致検索
            case 'perfect':
                $items_arr = $md->Perfect($request->input)
                    ->FromConditions($request, $searchedColumns)
                    ->get();
                break;
            //部分一致検索
            case 'fuzzy':
                $items_arr = $md->Fuzzy($request->input)
                    ->FromConditions($request, $searchedColumns)
                    ->get();
                break;
            //文字入力機能を使われなかった時
            default:
                $items_arr = $md->FromConditions($request, $searchedColumns)->get();
                break;
        }

        if ($items_arr !== null) {
            echo "<pre>";
            var_dump($items_arr); //まだstring（例：111-111）
            $items_arr = $items_arr->toArray();
            var_dump($items_arr); //intになっている（例：111）
            echo "</pre>";
            return view('list/list',
                compact( 'items_arr' )
            );
        }
    }
}

```

```php:search.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class search extends Model
{
    protected $table = 'item';
    protected $primaryKey = 'id';

   /**
   * 指定したidの情報だけを含むクエリーのスコープ
   *
   * @param query $query
   * @param string $input
   * @return builder
   */
    //完全一致
    public function scopePerfect($query, $input)
    {
        return $query->where('id', $input);
    }
    //前方一致
    public function scopeFuzzy($query, $input)
    {
        return $query->where('id', 'like', "$input%");
    }

   /**
   * 指定した条件（複数）の情報だけを含むクエリーのスコープ
   * $inputedConditionsのキーと$Searchedcolumnの要素は同じでなくてはならない
   *
   * @param query $query
   * @param mixed $input 入力された値の配列
   * @param array $searchedColumns 検索対象となるカラム名の配列
   * @return builder
   */
    public function scopeFromConditions($query, $input, array $searchedColumns)
    {
        //$conditionsの中に$columnsと一致するものがあればSQL文を発行する
        foreach ($searchedColumns as $column) {
            if (isset($input->$column)) {
                $query->where($column, $input->$column);
            }
        }
        return $query;
    }
}
```

## その後
toArray()をしていない状態でhtmlに出力。

```html:list.twig
object(Illuminate\Database\Eloquent\Collection)#203 (1) {
  ["items":protected]=>
  array(1) {
    [0]=>
    object(App\Models\search)#205 (26) {
      ["table":protected]=>
      string(4) "item"
      ["primaryKey":protected]=>
      string(2) "id"
      ["connection":protected]=>
      string(5) "mysql"
      ["keyType":protected]=>
      string(3) "int"
```

keyType、すごく怪しい……。

## 解決

```search.php
class search extends Model
{
    protected $table = 'item';
    protected $primaryKey = 'id';
    protected $keyType = 'string'; //これを追加

    ...
}
```
あっけなく解決。

## 補足情報（FW/ツールのバージョンなど）
Laravel 5.6.3
PHP 7.1.8

## 雑記
Eloquent難しい。