Laravel

LaravelのArgument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, int given, called inの解決方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

⇨ Laravel 記事の目次はこちら

Laravel で、「Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, int given, called in」というエラーが出たときの解決方法についてまとめました。

結論「データベースのカラムに対して json を指定していたら、モデルに追記する必要がある」

モデルに以下を追記する

protected $casts = [
'カラム名'  => 'json',
];

詳しく解説

マイグレーションファイル

Laravel のマイグレーションファイルにおいて、カラムに配列を保存することができます。

いろんなケースがあると思いますが、多対多でテーブル作ると大変な時とかで使うかもしれません(あまり使うものでも無いかなとも思います)

そのときは、マイグレーションファイルに以下のように記載します。

$table->json('post_ids'); //post_idsがカラム名です。post_idが配列ではいる想定。

コントローラーなどで保存する時

$model = new Model;
$model->post_ids = [1,2,3,4,5];
$model->save();

こんな感じで保存することができますが、、、この保存の時に、

Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, int given, called in

というエラーが発生しました。

モデルに追記する

例として User モデルに追記するとしたら、こうなります。

<?php

namespace App\Models\User;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'post_ids'  => 'json',
    ];
}

これを追記してから再び試してみたところ、同じエラーは発生せず、予期したとおりにデータが入りました。やった!

使用するときは普通に配列で使える

$ids = $user->post_ids //これで[1,2,3,4,5]と取得できるので、
foreach($ids as $id){

}

こんな感じで配列扱いすることが可能です。

注意点は、リレーションを書きづらいということ

リレーション先のデータを表示するのには向いていないので、気をつけてつかいましょう!!

まとめ

以上です。

誰かの参考になればと思います。

感想・苦情は TwitterDM にご連絡ください。

それでは!

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする

【laravel-breadcrumbs】Laravel でパンくずリストを実装する