Красноречивая связь между таблицами в Laravel

У меня есть три таблицы:

  1. collections у которого есть id, name
  2. genre_collection у которого есть id, genre_id, collection_id
  3. genres у которого есть id, name

Я хочу получить данные из коллекций с жанрами.

Коллекции Модель

class Collections extends Model{
public function genres(){
return $this->hasMany('App\Models\GenreCollectionRelationships', 'genre_id' , 'id');
}
}

generic_collection

class GenreCollectionRelationships extends Model{
public function genre(){
return $this->hasOne('App\Models\Genres', 'id', 'genre_id');
}
}

Контроллер поиска

class SearchController extends Controller{
$collection->genres;
foreach($collection->genres as $item){
$item->genre;
}
}

Этот код работает нормально. И вывод

фактический

"genres": [{
"id": 1,
"genre_id": 1,
"collection_id": 1,
"created_at": "2019-02-07 17:13:36",
"updated_at": "2019-02-07 17:13:36",
"genre": {
"name": "Action",
"meta": null
}
}]

Есть ли способ, которым я мог бы напрямую получить вывод, как показано ниже

ожидаемый

"genres": [ {
"name": "Action",
"meta": null
}]

Я старался hasManyThrough, принадлежит ToMany но ничего не получилось.

Заметка. Я нахожусь на уровне 5,7

Заранее спасибо.

1

Решение

Вы можете создать свой собственный запрос, чтобы достичь того, что вы ищете. Попробуй это:

$collection = Collection
::join('genres', 'genre.id', '=', 'collections.genre_id')
->select('collections.*', 'genres.name','genre.meta')
->get();
0

Другие решения

Я нахожу ваш код немного сложным для подражания …
Позвольте мне попробовать и понять, правильно ли я понял …

У вас есть две модели:

  • модель Collection сохранено в таблице collections
  • модель Genre сохранено в таблице genres

Поскольку между вами есть отношения многие ко многим, вам нужна третья таблица, чтобы связать их вместе.

По соглашению об именах Laravel ожидает, что вы назовете его на основе двух моделей, упорядоченных в алфавитном порядке. Таким образом, чтобы создать связь между коллекциями и жанрами, вам нужно создать таблицу collection_genre который имеет collection_id в качестве ссылки на таблицу коллекций, а также genre_id определить связанный жанр.

Затем вы можете определить ваши отношения следующим образом:

class Collection extends Model {
public function genres() {
$this->belongsToMany(\App\Models\Genre::class);
}
}

а также

class Genre extends Model {
public function collections() {
$this->belongsToMany(\App\Models\Collection::class);
}
}

Теперь я не уверен, как выглядит ваш контроллер, так как в вопросе есть какой-то неверный код, но я подозреваю, что вы хотите найти жанры для данной коллекции.

Ваш код может понравиться так:

Class CollectionController extends Controller {

function getGenres(Collection $collection) {
return $collection->genres;
}
}

Это вернуло бы жанры для данной коллекции.
Если вы хотите отформатировать это, вы можете создать Eloquent Resource для этого:

Class CollectionResource extends Resource {
public function toArray() {
return [
'name' => $this->name,
'meta' => $this->meta
];
}
}

В вашем контроллере вы можете сделать:

Class CollectionController extends Controller {

function getGenres(Collection $collection) {
return CollectionResource::collection($collection->genres);
}
}
0

в вашей коллекции модели

class Collections extends Model
{
protected $table='collections';
public $primaryKey='id';
protected $fillable = ['name'];

public function genres()
{
return $this->belongsToMany('App\Model\Genres','genre_collection','collection_id','genre_id')->withTimestamps();
}

}

в твоих жанровых моделях

class Genre extends Model {

protected $table='genres';
public $primaryKey='id';
protected $fillable = ['name'];


public function collections()
{
return $this->belongsToMany('App\Model\Collections','genre_collection','genre_id','collection_id')->get();
}

}
0

Вы создаете отношения между многими collections а также genre с помощью genre_collection сводная таблица. В таком случае, belongsToMany является целесообразным. И вам не нужна модель для таблицы genre_collection.

Коллекционная модель

class Collections extends Model
{
public function genres(){
return $this->belongsToMany('App\Models\Genres', 'genre_collection', 'genre_id', 'collection_id');
}
}

Жанры модели

class Genres extends Model
{

public function collections(){
return $this->belongsToMany('App\Models\Collections', 'genre_collection', 'collection_id', 'genre_id');
}
}

SearchController

class SearchController extends Controller
{
foreach($collection->genres as $item){
$item->genre; // get genre info
}
}
0

Я предполагаю, что вы хотите получить доступ к Generic непосредственно из коллекции. В этом случае вы можете определить отношение «многие ко многим» в модели коллекции напрямую к общей модели, чтобы получить к ней доступ. Пожалуйста, обратитесь это: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many . Извините если я не прав

0
По вопросам рекламы [email protected]