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