nullableMorphs
Метод nullableMorphs применяется внутри схемы миграции для создания двух полей: идентификатора модели и её типа. Первым параметром передаётся префикс для имён колонок, вторым необязательным параметром - имя индекса. В отличие от метода morphs, поля, создаваемые через nullableMorphs, позволяют хранить значение NULL, что полезно, когда связь с моделью не является обязательной.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->nullableMorphs($prefix);
});
?>
Пример
Давайте создадим таблицу 'comments' с полями для полиморфной связи, которые могут быть пустыми:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->string('content');
$table->nullableMorphs('commentable');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
Результат выполнения миграции:
"Table comments created with columns: id, content, commentable_id, commentable_type, created_at, updated_at"
Пример
Давайте добавим поля для полиморфной связи в уже существующую таблицу 'posts':
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->nullableMorphs('author');
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropMorphs('author');
});
}
};
?>
Результат выполнения миграции:
"Columns author_id and author_type added to posts table with nullable constraint"
Пример
Давайте создадим модель и используем полиморфную связь с возможностью NULL-значений:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Comment extends Model
{
protected $fillable = ['content', 'commentable_id', 'commentable_type'];
public function commentable(): MorphTo
{
return $this->morphTo();
}
}
?>
Давайте создадим комментарий без привязки к какой-либо модели:
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
class CommentController extends Controller
{
public function store()
{
$comment = new Comment();
$comment->content = 'This is a comment without parent model';
$comment->commentable_id = null;
$comment->commentable_type = null;
$comment->save();
echo $comment->id;
}
}
?>
Результат выполнения кода:
"1"
Давайте создадим комментарий, привязанный к статье:
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
use App\Models\Article;
class CommentController extends Controller
{
public function storeWithArticle()
{
$article = Article::find(1);
$comment = new Comment();
$comment->content = 'This comment belongs to article';
$comment->commentable()->associate($article);
$comment->save();
echo $comment->id;
}
}
?>
Результат выполнения кода:
"2"
Смотрите также
-
метод
morphs,
который создаёт обязательные поля для полиморфной связи -
метод
uuidMorphs,
который создаёт поля для полиморфной связи с UUID -
метод
morphTo,
который определяет обратную полиморфную связь в модели -
метод
nullable,
который делает отдельное поле допускающим NULL