雄辩的多行插入并在一个数组循环中

时间:2017-08-24 17:45:52

标签: php laravel eloquent laravel-5.3

我的用户输入遵循以下规则;

public function rules()
    {
        return [
            'phone_number' => 'required|array',
            'amount' => 'required|string|max:4',
            'phone_number_debit' => 'required|string|max:15',
        ];
    }

我想将数据保存在模型Transaction中。对于phone_number,它是一个可以有一个值或多个值的数组。所以留下foreach循环。

这就是我想要实现的,保存由数组中的记录数决定的不同行。

$transaction = new Trasaction();
$transaction->phone_number = $req->phone_number; //Value in the array
$transaction->amount = $req->amount;
$transaction->phone_number_debit = $req->phone_number_debit;
$transaction->save();

根据phone_number数组中的记录保存不同的记录。

然而,我无法想到实现这一目标的方法。

任何?

2 个答案:

答案 0 :(得分:2)

试试这个:

$data = request(['amount', 'phone_number', 'phone_number_debit']);

foreach($data['phone_number'] as $phone_number) {
    Trasaction::create([
       'amount' => $data['amout'],
       'phone_number' => $phone_number,
       'phone_number_debit' => $data['phone_number_debit']
    ]);
}

确保您的Trasaction模式设置为可填充属性,如下所示:

class Trasaction extends Model 
{
    protected $fillable = ['amount', 'phone_number', 'phone_number_debit'];
}

答案 1 :(得分:1)

简而言之,有很多方法可以做到这一点:

collect(request('phone_number'))->each(function ($phone) use ($req) {
    $transaction = new Trasaction();
    $transaction->phone_number = $phone; // element of the array
    $transaction->amount = $req->amount;
    $transaction->phone_number_debit = $req->phone_number_debit;
    $transaction->save();
});

TL; DR

一对多关系

为了获得更好的代码,您可以创建transaction_phones表,创建one-to-many关系。

您将创建一个TransactionPhone模型并添加:

public function transaction()
{
    return $this->belongsTo(Transaction::class);
}

TransactionPhone迁移:

Schema::create('transaction_phones', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('transaction_id');
    $table->string('phone_number');
    $table->timestamps();
});

Transaction模型中,您将获得相反的结果:

public function phones()
{
    return $this->hasMany(TransactionPhone::class);
}

public function addPhone($phone)
{
    return $this->phones()->create(['phone_number' => $phone]);
}

在你的控制器中:

$transaction = Trasaction::create(request()->only('amount', 'phone_number_debit'));

collect(request('phone_number'))->each(function ($phone) use ($transaction) {
    $transaction->addPhone($phone);
});

我希望这个答案可以帮到你。