Так что я бился головой об стену в этом вопросе, и до сих пор я не нашел решения для этого.
Я создал проект fre sh, cripsy Laravel с последним Lighthouse (4.12), и хотя я пытался следовать документации по этому вопросу, я совершенно растерялся.
Итак, согласно документам я создал следующую схему:
type Query {
posts: [Post!]! @paginate(defaultCount: 10)
}
type Mutation {
createPost(input: CreatePostInput! @spread): Post @create
}
input CreatePostInput {
title: String!
content: String
images: CreateImageMorphToMany
}
input CreateImageMorphToMany {
sync: [ID!]
connect: [ID!]
}
type User {
id: ID!
name: String!
email: String!
created_at: DateTime!
updated_at: DateTime!
images: Image! @morphOne
}
type Post {
id: ID!
title: String
content: String
images: [Image]! @morphMany
}
type Image {
id: ID!
src: String
name: String
imageable: Imageable @morphTo
}
union Imageable = Post | User
со следующими классами:
Почтовая модель
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphMany;
class Post extends Model
{
protected $fillable = [
'title', 'content'
];
public function images(): MorphMany
{
return $this->morphMany('App\Image', 'imageable');
}
}
Изображение модели
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Image extends Model
{
public function imageable(): MorphTo
{
return $this->morphTo();
}
}
И миграции:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('content');
$table->timestamps();
});
// This is only here for the sake of simplicity
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->string('src');
$table->string('name');
$table->integer('imageable_id');
$table->string('imageable_type');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
Schema::dropIfExists('images');
}
}
И, используя предоставленную площадку GraphQL, я ожидаю, что следующие мутации:
mutation {
createPost(input: {
title: "asd",
content: "asd",
images: {
connect: [1]
}
}) {
title
images {
src
}
}
}
вернут подключенное / синхронизированное изображение для созданной публикации, но возвращается только сообщение.
Если я установлю отношение вручную и запросить его, все будет работать правильно.
Заранее спасибо!