繁体   English   中英

将数组值插入到数据库laravel

[英]inserting array value to database laravel

我有一个名为name , descriptionfeatures的表单属性,其中features是多个复选框,就像

feature 1
feature 2
feature 2
feature 4

用户可以一次选择多个复选框。 我有一个名为product的数据库表,例如

-----------------------------------------
    id    name    description    features  
-----------------------------------------

当用户选择多个复选框时,我需要在功能列中插入所有复选框值。 现在我可以echo显所选的复选框值,如

 $feat = Input::get('features');
    foreach ($feat as $key => $n){
     echo $feat[$n];
    }

但我需要将这些功能插入到数据库中,对于正常插入,我们会这样做:

$product = new Product;
$product->name = Input::get('name');
$product->description = Input::get('description');
$product->features = Input::get('features');
$product->save();

但是我应该如何修改上面的代码以将数组值保存到数据库中? 我试图将值插入同一列,因为我不会根据功能查询它。

这很简单。 如果您知道您不会查询这些功能,那么将它们存储为 Json 或序列化数组就完全没问题了。 但是如果您需要查询它们并且它们是您的应用程序的一个关键方面,您应该将它们放在它们自己的表中。

我更喜欢以 Json 格式存储数组,因为它更易于阅读并且不特定于 PHP。 Laravel 为您提供了非常不错的选择来完成这项工作。

首先,在迁移中将features -field of you products -table 声明为 json:

Schema::create('products', function (Blueprint $table) {
    // ...
    $table->json('features');
});

然后告诉您的Product -model 在您访问它时自动将其转换为数组,只需设置$casts -attribute:

class Product extends Model
{
    // ...
    protected $casts = [
        'features' => 'json'
    ];
}

就是这样。 现在数组将存储为 Json,但是当您使用$product->features访问它时,您将返回一个数组。

为了让一切变得更简单,你应该在你的 Product 模型上设置一个可填充的属性

class Product extends Model
{
    // ...
    protected $fillable = ['name', 'description', 'features'];
}

这允许在您的控制器(或您创建产品的任何地方)中执行以下操作:

$product = Product::create(Input::all());

...而不是更新它并一一设置属性。

并且如上所述,请确保您不需要可查询的功能,这意味着您不会遇到您试图获得仅具有特定功能或某些东西的某些产品的情况。 但是如果你确实需要查找特征,你应该把它们放在它们自己的表中。 否则这种方法很好,因为它更方便。

请查看数据库规范化以获取有关如何存储 1:N 关系数据的信息。 您必须创建一个额外的表,如“product_feature”,其属性为:['id', 'product_id', 'function_name']。

然后你的 Insert 函数看起来像这样:

$product = new Product;
$product->name = Input::get('name');
$product->description = Input::get('description');
$product->save();

$feat = Input::get('features');

foreach ($feat as $key => $n){
    $product_function = new ProductFunction;
    $product_function->product_id = $product->id;
    $product_function->function_name = $feat[$n];
    $product_function->save();
}

希望能帮助到你!

您可以使用json_encode函数将数组保存为 json 字符串。

$product->features = json_encode(Input::get('features'));

但我也同意@AdrianBR 将数组值保存到数据库中的单个列是一个坏主意。

尽管我使用ajax发送值,但我有类似的东西

<div class="row mb-3" id="insert_new_item">
<div class="col-lg-6">
<p>Item Description</p>
<input value="" type="text" name="order[description]"  class="form-control product " id="" placeholder="Your Item Description">
</div>
<div class="col-lg-1 col-sm-6 col-12 mt-lg-0 mt-3">
    <p>Qty</p>
    <input placeholder="0" type="text" name="order[quantity]"  min="1" class="text-right form-control qty" id="" min="1">
</div>
<div class="col-lg-2 col-sm-6 col-12 mt-lg-0 mt-3">
    <p>Rate/Unit (&#8358; )</p>
    <input placeholder="0.00" type="text" name="order[rate]" class="text-right form-control rate" id="">
</div>
<div class="col-lg-2 mt-lg-0 mt-3">
    <p>Amount (&#8358; )</p>
    <input  type="text" name="order[amount]" id="" class="text-right form-control amount" readonly value="0" >
</div>
<div class="col-lg-1">
    <span><i class="fa fa-times text-danger  removeItem" style="font-size: 22px"></i></span>
</div>

所以当我 console.log(any value) 我得到这个:

["0" : "value 1", "1" : "value 2"]

从我的控制器我可以做到这一点

foreach ($request->description as $key => $description) {
    $order = Order::create([
        'description' => $description,
        'amount' => $request->rate[$key],
        'quantity' => $request->quantity[$key],
        'invoice_id' => 7
     ]);

}

你可以这样插入,

$candidate_data = 数组(

            'mobile' => $request->get('mobile'),
            'password' => $request->get('password')
    );

DB::('tablename')->insert($candidate_data);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM