Если по какой-либо причине необходимо инициировать события Eloquent, и вы хотите оптимизировать проблему n + 1, я бы предложил использовать транзакцию. Это все равно выдаст n
запросов, но база данных может оптимизировать это посредством массовой вставки (из-за транзакции). Он обладает дополнительным преимуществом согласованности данных (либо все вставки выполняются успешно, либо ни одна из них не выполняется).
$result = getResult();
\DB::transaction(function() use ($result) {
foreach($result as $item) {
FieldRuleResult::create($item);
}
});
Если вас не волнует запуск событий Eloquent, и вы просто хотите «массово вставить», вы можете использовать метод insert
, как упомянул Фабиан. Тем не менее, я бы посоветовал использовать транзакцию базы данных для согласованности данных.
$result = getResult();
\DB::transaction(function() use ($result) {
FieldRuleResult::insert($result);
});
В этом последнем случае, если количество записей, которые вы собираетесь вставить, может быть «большим», вы также можете разделить эти вставки на части. (например, 100 за раз, а не все сразу)
yield return
ключевое слово и лямбды действительно включают создание скрытых классов во время компиляции и выделение дополнительных объектов во времени выполнения, и если Ваше образование находится в C или C++ затем, только естественно касаться производительности.
Естественный, но неправильно!
Я попытался измерить издержки для лямбд с закрытием по локальным переменным и нашел, что это было так невероятно маленьким (вопрос наносекунд), что это не будет иметь значения почти во всех приложениях.
Это зависит от типа если m_sources.
Если это - Контекст Данных от LINQ до SQL или Платформы Объекта аргумент, Вы передаете, компилируется как экземпляр Выражения и анализируется для создания SQL (с помощью модели данных). Существуют некоторые реальные затраты в этом процессе, но вероятно (в большинстве случаев) быть во власти распространения в прямом и обратном направлениях к базе данных.
Если это - IEnumerable затем, Где в значительной степени реализован как:
public static IEnumnerable<T> Where(this IEnumerable<T> input, Func<T, bool> predicate) {
foreach (var v in input) {
if (predicate(v)) {
yield return v;
}
}
}
Который довольно эффективен и работает лениво (поэтому, если Вы убежите из своего цикла рано, то предикат не будет применен к целому набору).
В основном, да, это - то же, O (n).
Где пункт будет выполняться, в то время как Вы циклично выполняетесь через свой список (т.е. если Вы повреждаетесь после первого объекта, следующие объекты не будут протестированы).