【问题标题】:LARAVEL 5.5: How to optimally add an array to the database?LARAVEL 5.5:如何以最佳方式将数组添加到数据库中?
【发布时间】:2018-04-03 03:05:30
【问题描述】:

我的数据库中有 2 个表。我的第一张桌子,有文字的桌子:

结构表“单词”:

--------------
[id] | [word]
--------------
[11] | [тоҷик]
[12] | [ӯзбек]
[13] | [падар]
[14] | [модар]
[15] | [китоб]
[16] | [қалам]
[17] | [ручка]
--------------

第二张表,带说明的表:

结构表“描述”:

---------------------------------------
[id] | [word_id] | [description]
---------------------------------------
[1]  | [11]      | [Миллати давлати...]
[2]  | [12]      | [Ӯзбекистон давл...]
[3]  | [13]      | [Шахсе ки сарвар...]
[4]  | [14]      | [Инсоне мобошанд...]
[5]  | [15]      | [Китоб - ин пред...]
[6]  | [16]      | [Предмети барои ...]
[7]  | [17]      | [Предмет барои н...]
---------------------------------------

数组中的描述词示例:

$array_words_description = array
(
    'тоҷик' => 'Миллати давлати Ҷумҳурии Тоҷикистон. Забони давлати мазкур.',
    'ӯзбек' => 'Ӯзбекистон давлати дар Осиёи маркази ҷойгиршуда. Забони давлатиашон забони ӯзбеки мебошад.',
    'падар' => 'Шахсе ки сарвари оила мебошад ва оилаи худро бо меҳру муҳаббат ва бо хӯрду - хӯрок таъмин менамояд.',
    'модар' => 'Инсоне мобошанд, ки мову шуморо ба дунё оварда ба воя мерасонанд. Бузургтарин шахс дар олам ин модар аст.',
    'китоб' => 'Китоб - ин предмете, ки ба ҳамаи мо илму маърифатро, донишу сабақро меомӯзонад.',
    'қалам' => 'Предмети барои нашитаҷот пешбинишуда.',
    'ручка' => 'Предмет барои навистан пешбини шудааст. Бисёртар ин предметро донишомӯзандагон истифода мебаранд.',
);

如何通过将数组键中的单词标识符从word 表添加到word_id 字段,从而将此描述添加到description 表中。

【问题讨论】:

    标签: php arrays database laravel laravel-5.5


    【解决方案1】:

    你可以这样做:

    foreach ($array_words_description as $word => $description) {
        $word = Word::create(['word' => $word]);
        $word->description()->create(['description' => $description]);
    }
    

    您可以在$fillable 数组中添加列名并在Word 模型中定义description 关系。

    但我建议您只对单词及其描述使用一张表,并仅使用一个查询插入数据,而不是创建 N*2 个查询:

    array_walk(&$array_words_description, function ($word, $description) {
        return compact('word', 'description');
    });
    
    Word::insert($array_words_description);
    

    【讨论】:

    • +1 回答@Alex Mezenin。对于我的项目需要第一种方法。但是当我在 Word 模型结束时添加 protected $fillable = ['description']; 时执行此错误:"SQLSTATE[HY000]: General error: 1364 Field 'word' doesn't have a default value (SQL: insert into words` (updated_at, created_at) 值 (2017-10-22 20:42:14, 2017-10-22 20: 42:14))` 代码找不到word 字段添加值。因为在 filleable 中传递了另一个字段。我可以在$fillable 中指定这两个字段吗?如何向$fillable 变量添加多个字段?
    • 对于Word 模型,您需要使用word,对于Description 模型,您需要使用description
    • 如果数据库中有我想从数组中添加但没有描述的单词怎么办?字段包含索引以避免单词重复。 @Alex Mezenin
    • 由于添加的值存在,查询会报错。
    • 并且不会添加描述。我是对的? @Alexey Mezenin
    【解决方案2】:

    您的 eloquent 模型类中可能没有任何关系 你可以通过这样做来实现你想要的

    $word_id = DB::table('words')->insertGetId(['word' => $word]);
    DB::table('descriptions')->insert(['word_id' => $word_id, 'description' => $description]);
    

    【讨论】:

    • 不错。您对索引字段的方法是什么?如果我们在同一个数组中添加一个新单词并将其移动到数组的末尾,那么由于 polyex 导致重复出现错误并且没有添加新单词。是否可以借助 updateOrInsert()insertGetId() 的方法来解决这个问题? @mirage_909
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2011-09-08
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多