Как взять все слова в одном нормальном массиве из базы данных в рамках Laravel с минимальной потерей времени?

Я хочу взять все слова из базы данных в массив по умолчанию . У меня более 50 000 слов в базе данных, и, скорее всего, это число составляет до миллиона. Поэтому я хочу, чтобы эта операция не занимала много времени. Я пробовал такие способы, при которых ни одно слово не помещается в обычный массив. То есть слова передаются ассоциативному массиву:

$words = DB::table('words')->pluck('word'); dump($words); 

Результат:

 Collection {#197 ▼ #items: array:12 [▼ 0 => "тоҷик" 1 => "ӯзбек" 2 => "қирғиз" 3 => "эрон" 4 => "япон" 5 => "англис" 6 => "тоҷик" 7 => "ӯзбек" 8 => "қирғиз" 9 => "эрон" 10 => "япон" 11 => "англис" ] } 

Второй метод:

 $words = DB::select("SELECT `word` FROM `words`"); dump($words); 

Результат:

 array:12 [▼ 0 => {#210 ▼ +"word": "тоҷик" } 1 => {#207 ▼ +"word": "ӯзбек" } 2 => {#209 ▼ +"word": "қирғиз" } 3 => {#206 ▼ +"word": "эрон" } 4 => {#208 ▼ +"word": "япон" } 5 => {#205 ▼ +"word": "англис" } 6 => {#204 ▼ +"word": "тоҷик" } 7 => {#203 ▼ +"word": "ӯзбек" } 8 => {#202 ▼ +"word": "қирғиз" } 9 => {#200 ▼ +"word": "эрон" } 10 => {#213 ▼ +"word": "япон" } 11 => {#214 ▼ +"word": "англис" } ] 

И я хочу взять все слова в этой форме на обычном массиве:

 array:12 [▼ 0 => "тоҷик" 1 => "ӯзбек" 2 => "қирғиз" 3 => "эрон" 4 => "япон" 5 => "англис" 6 => "тоҷик" 7 => "ӯзбек" 8 => "қирғиз" 9 => "эрон" 10 => "япон" 11 => "англис" ] 

Мне нужно это, чтобы получить разницу между двумя массивами. Входной массив является оптимистичным массивом, поэтому мне нужно взять все слова из баса, чтобы добавить к обильному массиву. В общем, есть ли какая-либо функция, такая как array_diff() в самой структуре Laravel?

 $diff = array_diff($input_array, $words_from_db); 

И добавьте разницу в базу данных:

 foreach ($diff as $value) { DB::table('words')->insert(['word'=>$value]); } 

Насколько корректен мой метод добавления большого количества слов (данных) в базу данных? Могу ли я оптимизировать, если, конечно, это возможно?

В общем я нашел эту функцию от Laravel:

 public function diff($items) { return new static(array_diff($this->items, $this->getArrayableItems($items))); } 

Но как я могу использовать его для получения массивов diff 2? Входным массивом будет массив по умолчанию и второй массив из db

Спасибо всем за то, что вы ответили и простите меня за извинения за грамматические ошибки в вопросе.

Вы можете вставлять уникальные слова в базу данных полностью внутри MySQL, это всегда должно быть быстрее, чем вытягивать все слова в память, различать их и отправлять уникальные значения.

Для этого вам нужно добавить уникальный индекс в столбец слов. (ref: https://dev.mysql.com/doc/refman/5.7/en/create-index.html )

 CREATE UNIQUE INDEX `idx_word` ON `db`.`words` (word); 

Затем на вашей вкладке вам нужно добавить ключ ON DUPLICATE KEY (построитель запросов Laravel не поддерживает дубликат ключа – может использовать raw для вставки) ref: https://dev.mysql.com/doc/refman/5.7/en/insert- on-duplicate.html , https://laravel.com/docs/5.5/queries#raw-expressions

 INSERT INTO word VALUES ('foo'),('bar') ON DUPLICATE KEY word = VALUES(word); 

Я использовал бы дубликат, а не вставлял игнорировать. Я думаю, что игнорирование вставки может скрыть другие потенциальные проблемы, не связанные с дублирующимся ключом.

Вы можете получить diff в массиве Laravel 5.5 так:

 $words = DB::table('words')->pluck('word')->toArray(); // Collection converted to simple array 

И вы можете использовать функцию по умолчанию в php для получения diff-массивов:

 $result = array_diff($input_default_array, $words);