Кажется, вы забыли заменить имена методов и переменных при копировании кода votes
$product = new Product();
$product->product_no = $request->product_no;
$product->description = $request->description;
$product->product_name = $request->$model->getProduct_name();
if (auth()->user()->votes()->save($vote))
--------------------^^^^^^^-------^^^^^--
return response()->json([
'success' => true,
'data' => $product->toArray()
]);
Это должно быть
if (auth()->user()->products()->save($product))
Также есть другое поле ([114 ]) что вы пытаетесь сохранить, но это не заполняется.
protected $fillable =[
'product_no','description', 'product_name'
];
А также, вы можете рассмотреть возможность использования одного и того же шаблона при именовании ваших переменных и методов. Вы можете сказать getProductName
или get_product_name
вместо getProduct_name
.
Хорошо, на строке ~ 60 КБ это будет выполняться примерно на 40% быстрее, чем ваша версия:
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
StringBuilder sb = new StringBuilder(new string(replacement, original.Length));
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb[index] = original[index++];
}
return sb.ToString();
}
Хитрость заключается в том, чтобы инициализировать новую строку со всеми заменяющими символами, поскольку большинство из них будут заменены.
Я собираюсь бросить свои 2 цента, а затем посмотреть, придумает ли кто-нибудь что-нибудь более элегантное. В общем случае:
<E> List<E> cons(E e, List<E> list) {
List<E> res = Lists.newArrayListWithCapacity(list.size() + 1);
res.add(e);
res.addAll(list);
return res;
}
с ImmutableList
(не знаю, насколько это эффективно): есть перегрузка, где шаблон
может быть строкой char []
или
?
Вот еще одна версия для вас. Мои тесты показывают, что его производительность довольно хорошая.
public static string ReplaceNot(
this string original, char[] pattern, char replacement)
{
char[] buffer = new char[original.Length];
for (int i = 0; i < buffer.Length; i++)
{
bool replace = true;
for (int j = 0; j < pattern.Length; j++)
{
if (original[i] == pattern[j])
{
replace = false;
break;
}
}
buffer[i] = replace ? replacement : original[i];
}
return new string(buffer);
}
Разве вы не можете использовать Regex.Заменить так:
Regex regex = new Regex(@"[^.;/\\]");
string s = regex.Replace("test. stop; or, not", "*");
Это будет O (n). Кажется, вы заменяете все алфавиты и пробелы на *
, почему бы просто не проверить, является ли текущий символ алфавитом / пробелом, и заменить его?
StringBuilder имеет перегрузку, которая принимает символ и число, поэтому вам не нужно создавать промежуточные строки для добавления в StringBuilder. Я получаю около 20% улучшения, заменив это:
sb.Append(new string(replacement, index - old - 1));
на:
sb.Append(replacement, index - old - 1);
и это:
sb.Append(new string(replacement, original.Length - (old + 1)));
на:
sb.Append(replacement, original.Length - (old + 1));
(я проверил код, который вы сказали, был примерно в четыре раза быстрее, и я нашел его примерно в 15 раз медленнее ...)