Laravel - многие ко многим

Рейтинг: 0Ответов: 1Опубликовано: 05.04.2023

Не работает связь многие ко многим. Не могу понять, почему?

Musics.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Musics extends Model {

    protected $table = "musics";

    public function authors() {
        return $this->belongsToMany(Authors::class, 'authors_music', 'music_id', 'author_id');
    }
}

Author.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Authors extends Model {

    protected $table = "authors";

    public function musics() {
        return $this->belongsToMany(Musics::class, 'authors_music', 'author_id', 'music_id');
    }
}

UPD: Перебор через цикл ничего не дает, возвращается пустая коллекция.

web.php

<?php


Route::get('/', function() {
    $musics = Musics::all();
    var_dump($musics[0]['authors']); // Для справки: $music[0]->authors выдает тот же результат
});

Получаю пустую коллекцию. По какой-то непонятной для меня причине он не хочет работать с другой таблицей.

Ответы

▲ 2
// Всё логично. 

$musics = Musics::all();

// $musics содержит коллекцию эл-тов
// соответственно, нужно перебирать её, чтобы посмотреть какое-либо свойство
foreach ($musics as $music) {
  var_dump($music->authors);
}
// ну, или var_dump($musics[0]->authors), но тогда в чем смысл все записи брать?
// 1 запись: Musics::first()|last()|find($id) и тогда можно обращаться $musics->authors

// не забываем проблему N+1 !!! лучше всегда подтягивать связи, если они используются
$musics = Musics::with('authors')->get();