У меня есть три таблицы:
collections
у которого есть id
, name
genre_collection
у которого есть id
, genre_id
, collection_id
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
Заранее спасибо.
Вы можете создать свой собственный запрос, чтобы достичь того, что вы ищете. Попробуй это:
$collection = Collection
::join('genres', 'genre.id', '=', 'collections.genre_id')
->select('collections.*', 'genres.name','genre.meta')
->get();
Я нахожу ваш код немного сложным для подражания …
Позвольте мне попробовать и понять, правильно ли я понял …
У вас есть две модели:
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);
}
}
в вашей коллекции модели
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();
}
}
Вы создаете отношения между многими 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
}
}
Я предполагаю, что вы хотите получить доступ к Generic непосредственно из коллекции. В этом случае вы можете определить отношение «многие ко многим» в модели коллекции напрямую к общей модели, чтобы получить к ней доступ. Пожалуйста, обратитесь это: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many . Извините если я не прав