РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
111 of 1392 menu

Поле 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 для моделей
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить