Laravel: получение записей со строковыми идентификаторами нарушает работу приложенияPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Laravel: получение записей со строковыми идентификаторами нарушает работу приложения

Сообщение 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';
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... breaks-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»