dougongyou7364 2019-03-17 15:06
浏览 341
已采纳

PHP / Laravel - Foreach存储到数据库中(\ Grammar :: parameterize()错误)

I have an array, which looks like this:

array:3 [▼
  "field" => array:2 [▼
    0 => "fromName"
    1 => "from"
  ]
  "operator" => array:2 [▼
    0 => "="
    1 => "="
  ]
  "value" => array:2 [▼
    0 => "Oliver"
    1 => "oliver@mywebsite.com"
  ]
]

I am trying to save the above array, into my database table called email_rules:

My database table

Below is my code.

StreamEmailRulesController.php:

public function store(Stream $stream)
{
    //Validate the request.
    //Validate the request.
    $attributes = request()->validate([
        'field' => 'required|array|min:1',
        'field.*' => [
            'required', 'string',
            Rule::in(['fromName', 'from']),
        ],
        'operator' => 'required|array|min:1',
        'operator.*' => [
            'required', 'string',
            Rule::in(['=', '!=', 'matches']),
        ],
        'value' => 'required|array|min:1',
        'value.*' => 'required|string|min:3|max:255',
    ]);

    //Add the document to the database.
    $stream->addRules($attributes);

    //Return back.
    return redirect()->back();
}

Now the $stream->addRules() function is responsible for saving the data to the database.

Stream.php:

/**
* A stream can have many rules.
*/
public function rules()
{
    return $this->hasMany(EmailRule::class);
}


/**
 * Add Email Rules(s) to the stream
 *
 * @return Illuminate\Database\Eloquent\Model
 */
public function addRules(array $attributes)
{
    return $this->rules()->create($attributes);
}

Now, above does not work. I get below error:

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

What am I doing wrong?

  • 写回答

3条回答 默认 最新

  • doudong4532 2019-03-17 17:11
    关注

    The problem was that Laravels create or createMany expect an array with key => pair values, where the key corresponds to the database columns.

    This article from Adam Wathan helped me out a lot.

    This is what I ended up doing:

      $requestData = collect(request()->only('field', 'operator', 'value'));
      $rules = $requestData->transpose()->map(function ($ruleData) {
             return new EmailRule([
                 'field' => $ruleData[0],
                 'operator' => $ruleData[1],
                 'value' => $ruleData[2],
             ]);
      })->toArray();
    
      //Add the rules to the database.
      $stream->addRules($rules);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行