У меня есть приложение 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