Поле uuidMorphs
Метод uuidMorphs используется при создании миграций для определения полей полиморфной связи, где в качестве идентификаторов используются UUID. Он создает два поля: одно для идентификатора связанной модели (тип UUID), а другое для типа модели (тип строка). Это позволяет реализовать полиморфные отношения с использованием UUID вместо целочисленных идентификаторов. Первым параметром передается префикс для имен полей, например, 'commentable' создаст поля commentable_id и commentable_type.
Метод uuidMorphs аналогичен методу morphs, но вместо обычных целочисленных идентификаторов использует UUID. Это особенно полезно в распределенных системах, где нужно гарантировать уникальность идентификаторов без централизованного генератора. Для работы с этим методом необходимо использовать трейт HasUuids в связанных моделях или самостоятельно генерировать UUID.
Синтаксис
<?php
Schema::create('table_name', function (Blueprint $table) {
$table->uuidMorphs('morph_name');
});
?>
Пример
Давайте создадим таблицу comments, которая будет иметь полиморфную связь с другими моделями с использованием UUID:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCommentsTable extends Migration
{
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->text('content');
$table->uuidMorphs('commentable');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('comments');
}
}
?>
После выполнения миграции в таблице comments появятся поля:
["commentable_id (uuid)", "commentable_type (varchar)"]
Пример
Давайте создадим модели, которые используют полиморфную связь с UUID:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Comment extends Model
{
public function commentable(): MorphTo
{
return $this->morphTo();
}
}
?>
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Relations\MorphMany;
class Post extends Model
{
use HasUuids;
public function comments(): MorphMany
{
return $this->morphMany(Comment::class, 'commentable');
}
}
?>
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Relations\MorphMany;
class Article extends Model
{
use HasUuids;
public function comments(): MorphMany
{
return $this->morphMany(Comment::class, 'commentable');
}
}
?>
Пример
Давайте создадим комментарии для разных моделей с использованием UUID:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use App\Models\Article;
use App\Models\Comment;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function store(Request $request)
{
$post = Post::find($request->post_id);
$comment = $post->comments()->create([
'content' => $request->content,
]);
echo "Comment created with ID: " . $comment->id;
}
}
?>
Результат выполнения кода:
"Comment created with ID: 123e4567-e89b-12d3-a456-426614174000"
Пример
Давайте получим все комментарии для конкретной модели:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use App\Models\Comment;
class CommentController extends Controller
{
public function show($postId)
{
$post = Post::find($postId);
$comments = $post->comments;
foreach ($comments as $comment) {
echo $comment->content . "\n";
}
}
}
?>
Результат выполнения кода:
"First comment content"
"Second comment content"
"Third comment content"
Смотрите также
-
метод
morphs,
который создает стандартные поля для полиморфной связи -
метод
nullableMorphs,
который создает поля с возможностью NULL -
метод
uuid,
который создает поле типа UUID -
трейт
HasUuids,
который автоматически генерирует UUID для моделей