У меня есть приложение Laravel, которое служит серверным API. Я изменил идентификаторы с целых чисел на строки в таблице комментариев, чтобы можно было добавить к идентификатору некоторые сокращения в зависимости от модели, к которой он принадлежит. Это означает, что вместо строки комментария, получающей идентификатор 5, она получает идентификатор CMT-45876348.
Но после внесения этого изменения мое приложение запустилось сломать. Когда я достиг конечной точки нумерации страниц (которая работала раньше), журналы моего терминала Laravel показывают такие результаты:
# PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 40960 bytes) in \vendor\laravel\framework\src\Illuminate\Collections\Collection.php on line 1445
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 65536 bytes) in \vendor\composer\ClassLoader.php on line 576
или другое сообщение об ошибке о слишком большом времени ответа.
Я хотел убедиться, что это произошло из-за этих идентификаторов. Поэтому я оставил весь код прежним, но оставил таблицу комментариев пустой, и приложение заработало как обычно. Поэтому я хочу знать, как простое изменение идентификатора может сломать весь этот раздел приложения.
перенос комментариев:
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('parent_id')->nullable()->constrained('comments')->onDelete('cascade');
$table->string('id')->primary();
$table->string('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('comments')->onDelete('cascade');
$table->foreignId('user_id')->nullable()->constrained()->onDelete('cascade');
$table->foreignId('post_id')->constrained()->onDelete('cascade');
$table->longText('content');
Модель комментариев:
class Comment extends Model {
use HasFactory, softDeletes;
protected $primaryKey = 'id';
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::creating(function ($comment) {
if (empty($comment->id)) {
$comment->id = IdGenerator::generate('comment');
}
});
}
Класс, используемый для генерации идентификаторов:
class IdGenerator {
public static function generate(string $modelType): string
{
$prefix = self::getModelPrefix($modelType);
$timestamp = round(microtime(true) * 1000);
return $prefix . '-' . $timestamp;
}
/**
* Returns the model prefix based on the model type.
*
* @param string $modelType
* @return string
*/
private static function getModelPrefix(string $modelType): string
{
$modelPrefixMap = [
'user' => 'USR',
'post' => 'PST',
'comment' => 'CMT',
'like' => 'LIK',
'tag' => 'TAG',
];
return $modelPrefixMap[$modelType] ?? 'GEN';
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... breaks-app
Laravel: получение записей со строковыми идентификаторами нарушает работу приложения ⇐ Php
Кемеровские программисты php общаются здесь
1729896608
Anonymous
У меня есть приложение Laravel, которое служит серверным API. Я изменил идентификаторы с целых чисел на строки в таблице комментариев, чтобы можно было добавить к идентификатору некоторые сокращения в зависимости от модели, к которой он принадлежит. Это означает, что вместо строки комментария, получающей идентификатор 5, она получает идентификатор CMT-45876348.
Но после внесения этого изменения мое приложение запустилось сломать. Когда я достиг конечной точки нумерации страниц (которая работала раньше), журналы моего терминала Laravel показывают такие результаты:
# PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 40960 bytes) in \vendor\laravel\framework\src\Illuminate\Collections\Collection.php on line 1445
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 65536 bytes) in \vendor\composer\ClassLoader.php on line 576
или другое сообщение об ошибке о слишком большом времени ответа.
Я хотел убедиться, что это произошло из-за этих идентификаторов. Поэтому я оставил весь код прежним, но оставил таблицу комментариев пустой, и приложение заработало как обычно. Поэтому я хочу знать, как простое изменение идентификатора может сломать весь этот раздел приложения.
перенос комментариев:
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('parent_id')->nullable()->constrained('comments')->onDelete('cascade');
$table->string('id')->primary();
$table->string('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('comments')->onDelete('cascade');
$table->foreignId('user_id')->nullable()->constrained()->onDelete('cascade');
$table->foreignId('post_id')->constrained()->onDelete('cascade');
$table->longText('content');
Модель комментариев:
class Comment extends Model {
use HasFactory, softDeletes;
protected $primaryKey = 'id';
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::creating(function ($comment) {
if (empty($comment->id)) {
$comment->id = IdGenerator::generate('comment');
}
});
}
Класс, используемый для генерации идентификаторов:
class IdGenerator {
public static function generate(string $modelType): string
{
$prefix = self::getModelPrefix($modelType);
$timestamp = round(microtime(true) * 1000);
return $prefix . '-' . $timestamp;
}
/**
* Returns the model prefix based on the model type.
*
* @param string $modelType
* @return string
*/
private static function getModelPrefix(string $modelType): string
{
$modelPrefixMap = [
'user' => 'USR',
'post' => 'PST',
'comment' => 'CMT',
'like' => 'LIK',
'tag' => 'TAG',
];
return $modelPrefixMap[$modelType] ?? 'GEN';
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79127495/laravel-retrieving-records-with-string-ids-breaks-app[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия