1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

結論

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

流れ

前提

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

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

問題のコード

入力された品番は111-111とする。

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' )
            );
        }
    }
}

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に出力。

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難しい。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?