【问题标题】:laravel Error: Array to string conversionlaravel 错误:数组到字符串的转换
【发布时间】:2019-05-01 02:36:19
【问题描述】:

我已经浏览了我在 youtube、stakoverflow 和其他网站上可以找到的所有解决方案。我正在使用 Select2 添加多个角色,但我始终遇到相同的错误。

<select id="role" name="role_id[]" multiple='multiple' 
        class="form-control js-example-basic-multiple">
    @foreach($roles as $role)
        <option value="{{$role->id}}">{{$role->name}}</option>
    @endforeach
</select>

DD 函数显示完美结果,但之后显示错误。

在我添加带有 name="role_id[]" 的 [] 之前,它可以完美运行。 形式行动如下。

public function store(Request $request)
{
    $this->validate($request, [
        'name'=> 'required|string|max:225',
        'status'=> 'required',
        'role_id'=> 'required',
        'email'=> 'required|string|email|max:225|unique:users',
        'password'=> 'required|string|min:6|confirmed'
    ]);

    $password = Hash::make($request->password);
    // dd($request->all());

    $user = new User;
    $user->name = $request->name;
    $user->status = $request->status;
    $user->role_id = $request->role_id;
    $user->email = $request->email;
    $user->password = $password;
    $user->remember_token;
    $user->save();
    // $user->roles()->sync($request->roles, false);
    return back()->with('message', 'User added successfully!!');
}
如果我验证整数'role_id'=>'required|integer',它会显示错误

迁移如下

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->unsignedInteger('role_id')->default(1);
            $table->boolean('status')->default(0);
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

【问题讨论】:

  • 将其更改为 'role_id.*'=&gt; 'required', 并且 role_id 是数组的集合,您应该使用循环运行该数组,然后插入到 users role 表中,因为用户拥有多个角色,您需要将它们保存在另一个表中,例如用户角色
  • error is here $user-&gt;role_id = $request-&gt;role_id; 在这一行中,您将数组 ($request-&gt;role_id) 分配给单个变量。因此,您应该首先创建数组,然后在$request-&gt;role_id 上使用 foreach 循环为数组赋值
  • 我在验证中还有另一个错误。如果我使用 'role_id'=> 'required|integer' 而不是 'role_id'=> 'required',我会收到错误“角色 id 不是整数”。
  • @AliAnwar 是什么错误??您应该在问题中包含实际的错误消息
  • 当我验证整数时,错误是“角色 ID 不是整数”。

标签: php sql laravel jquery-select2


【解决方案1】:

$request-&gt;role_id 是数组,所以你不能直接将数组存储到数据库,所以你可以使用以下,

  $user->role_id = json_encode($request->role_id);

稍后您可以使用json_decode 函数获取role_id 数组。

【讨论】:

  • 感谢您回答我的问题。我收到此代码的另一个错误。
  • SQLSTATE[22007]:无效的日期时间格式:1366 不正确的整数值:第 1 行的列 'role_id' 的整数值:'["2","3"]'(SQL:插入到usersname, status, role_id, email, password, updated_at, created_at) 值 (Admin, 0, ["2","3"], admin@xyz.com, $2y$10$DEzjq.XtHPL06FnbtPTa9Oht0Bm5k9eJQT1dh6.A/5TBmVqMGi3yy, 2018-11-29 06:22:48, 2018-11-29 06:22:48)))
【解决方案2】:

由于您有角色数据透视表,因此您的用户表中不需要 role_id 列

public function store(Request $request)
{
$this->validate($request, [
    'name'=> 'required|string|max:225',
    'status'=> 'required',
    'role_id'=> 'required|array',
    'email'=> 'required|string|email|max:225|unique:users',
    'password'=> 'required|string|min:6|confirmed'
]);

$password = Hash::make($request->password);
// dd($request->all());

$user = new User;
$user->name = $request->name;
$user->status = $request->status;
$user->email = $request->email;
$user->password = $password;
$user->remember_token;
$user->save();

foreach($request->input('role_id') as $role)
{
   $user->assign($role);
}
// $user->roles()->sync($request->roles, false);
return back()->with('message', 'User added successfully!!');
}

【讨论】:

  • 感谢您回答我的问题,但我再次收到此代码错误。
  • 请在本教程中查看这个 33:00 到 33:35 youtube.com/watch?v=BNUYaLWdR04&t=232s
  • 那是因为您在数据库列role_id 中设置了长度,当您在下拉列表中选择多个角色时,该长度会超出。所以让它变大为varchar(256)
  • 使用required|array作为数组进行验证
  • 我正在听从你的建议。
【解决方案3】:

问题:

$request-&gt;role_id 是一个数组。不是一个单一的数据。

建议:

这里有两件事

您为一个用户分配多个规则

您不应将规则存储在用户表中

你应该这样做:

创建另一个表来存储用户角色

并单独存储用户规则

例子:

      $user = new User;
      $user->name = $request->name;
      $user->status = $request->status;
      $user->email = $request->email;
      $user->password = $password;
      $user->remember_token;
      $user->save();

      $roleAssigns = [];
      foreach($request->role_id as $role){
          $roleAssigns[] = [
              'role_id' => $role,
              'user_id' => $user->id
          ]
      }
      //UserRole is the model of user_roles table
      UserRole::insert($roleAssigns);

【讨论】:

  • 您正确地指出了问题。我尝试了您的代码,但再次出现语法错误。我在验证中也有另一个错误。如果我使用 'role_id'=> 'required|integer' 而不是 'role_id'=> 'required',我会收到错误“角色 id 不是整数”。我见过很多人使用多对多关系以相同的方式添加数据。
  • 如果控制器想要整数类型 role_id 那么你应该从视图中传递整数。它的视图问题。
  • 我正在关注这个过程,因为 Alex 在他的 youtube 教程中关注多对多关系。我还在许多教程中看到了多对多关系。但就我而言,它不起作用。请在本教程 youtube.com/watch?v=BNUYaLWdR04&t=232s 中查看 33:00 至 33:35 –
【解决方案4】:

你不能“回显”一个数组,这就是错误。

您需要将行收集到一个数组中,然后返回该数组

【讨论】:

    【解决方案5】:

    如果你想为你的.js 代码输出一个数组,你可以使用

    @json($array)

    从 Laravel 5.5 开始

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2016-09-01
      • 1970-01-01
      • 2014-12-14
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多