Хранение логов в mysql таблице
Паттерн хранения логов в таблице mysql
В одном из проектов есть необходимость хранит логи. В файл сохранять очень неудобно т.к. нужен поиск по типу.
Сделал такую структуру "project_id","type","data"
в поле data хранится объект в json формате
Со временем таблица очень сильно разрослась и при поиске нужных логов очень сильно лагает.
Решил для data сделать отдельную таблицу и реализовать отношение один к одному. Но для удобства разработки и что бы остальной код не переписывать внес правки в модель.
Вот эта реализация
<?php
namespace Callmind\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Callmind\Models\B24CallmindLogData;
class B24CallmindLog extends Model
{
use HasFactory;
protected $fillable = [
'member_id',
'type',
'data',
];
private mixed $pendingData = null;
protected $with = ['logData'];
protected $appends = ['data'];
protected static function booted(): void
{
static::created(function (self $model) {
if ($model->pendingData !== null) {
$model->logData()->updateOrCreate(
['log_id' => $model->id],
['data' => $model->pendingData]
);
$model->pendingData = null;
}
});
}
protected function data(): Attribute
{
return Attribute::make(
get: fn ($value) => $this->getData($value),
set: function ($value) { $this->setData($value); return []; },
);
}
private function getData($value)
{
return $this->logData?->data;
}
private function setData($value)
{
if (is_null($this->id)) {
$this->pendingData = $value;
return;
}
$this->logData()->updateOrCreate(
['log_id' => $this->id],
['data' => $value]
);
}
public function logData(): HasOne
{
return $this->hasOne(B24CallmindLogData::class, 'log_id');
}
}
Теперь в коде для создания лога вот такой код
\Callmind\Models\B24CallmindLog::create([
"member_id" => 2,
"type" => "test",
"data" => [
"sdf"=>"sdf",
],
]);
При получении
\Callmind\Models\B24CallmindLog::find(27);
Получаем
{
"id": 27,
"member_id": "2",
"type": "test",
"created_at": "2026-04-21T14:36:24.000000Z",
"updated_at": "2026-04-21T14:36:24.000000Z",
"data": {
"sdf": "233333333333"
},
"log_data": {
"id": 2,
"log_id": 27,
"data": {
"sdf": "233333333333"
},
"created_at": "2026-04-21T14:36:24.000000Z",
"updated_at": "2026-04-21T14:36:24.000000Z"
}
}
