Я хочу взять все слова из базы данных в массив по умолчанию . У меня более 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);