JSON ответ со всеми столбцами для отношения «многие ко многим» в Laravel - PullRequest
0 голосов
/ 13 апреля 2020

Я использую две модели в Laravel, которые связаны отношением «многие ко многим». Модели Pictures и Labels. Файл миграции для Labels:

class CreateLabelsTable extends Migration {
    public function up() {
        Schema::create('labels', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name', 128);
            $table->enum('type', [ 'text' , 'contact' ]);
            $table->timestamps();
        });
    }
    public function down() {
        Schema::dropIfExists('labels');
    }
}

Внутри модели для Picture я определил

class Picture extends Model {
    public function labels() {
        return $this->belongsToMany('App\Label')
            ->withTimestamps();
    }
}

В контроллере теперь я могу использовать следующий код PHP

$ptrPicture = Picture::findorfail(3); // '3' is an example of an id here 
return response()->json($ptrPicture->labels()->pluck('id')->toArray());

, что, например, приводит к [5, 6, 9] для идентификаторов Labels, которые связаны с Picture(3). Это хорошо работает, но теперь я не хочу возвращать идентификаторы только Label, но все столбцы для Label. Как мне получить что-то вроде следующего с Laravel?

[
    { id: 5, name: 'foo', type: 'text' },
    { id: 6, name: 'bar', type: 'text' },
    { id: 9, name: 'etc', type: 'contact' }
]

С pluck Я могу вернуть только один из столбцов? Как мне вернуть все три столбца?

ПО ЗАПРОСУ ... вот мои другие файлы миграции:

class CreatePicturesTable extends Migration {
    public function up() {
        Schema::create('pictures', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('filename', 256);
            $table->string('description', 4096)->nullable();
            $table->timestamps();
        });
    }
    public function down() {
        Schema::dropIfExists('pictures');
    }
}

class CreateLabelPictureTable extends Migration {
    public function up() {
        Schema::create('label_picture', function (Blueprint $table) {

            $table->bigInteger('label_id')->unsigned();
            $table->foreign('label_id')
                ->references('id')
                ->on('labels')
                ->onDelete('cascade');

            $table->bigInteger('picture_id')->unsigned();
            $table->foreign('picture_id')
               ->references('id')
                ->on('pictures')
                ->onDelete('cascade');

            $table->timestamps();

        });

    }
    public function down() {
        Schema::dropIfExists('label_picture');
    }
}

1 Ответ

1 голос
/ 13 апреля 2020

Любое из следующих действий выполнит эту работу.

$ptrPicture->labels->toArray(); // note the absence of brackets after 'labels'

// OR

$ptrPicture->labels()->get()->toArray();

Документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...