2016-09-29 3 views
-2

У меня есть 2 модели, игры и изображения. Когда я запрашиваю '/ games' в своем API, я возвращаю JSON для всех игр в базе данных. Как я должен запросить БД в своем GameController для передачи изображения, связанного с игрой, без явного создания столбца «image_url» в моей игровой модели? Это единственный способ? Я хотел бы гнездо, как это:Laravel REST API с полиморфными отношениями с вложенными JSON

{ 
id: 1, 
title: 'Halo 5', 
image: { 
     url: 'http://theimageurlhere.com', 
     imageable_id: 1, 
     imageable_type: 'App\Game' 
    } 
} 

ответ

1

В модели игры вам нужно написать что-то вроде этого:

public function images() 
{ 
    return $this->hasMany('App\Images', 'imageable_id', 'id') 
     ->whereImageableType('App\Game'); 
} 

И когда вы берете игры:

return Games::select() 
     ->with('images') 
     ->get(); 
+0

Проверка этого сейчас. Я дам вам знать. Спасибо за ваш ответ, а не за downvote :) – plushyObject

+0

Это было очень близко к тому, что я искал. Мне удалось узнать больше о желаемой загрузке в Laravel 5 и заставить ее работать. Благодаря тонну! Это определенно теряется в документации на Laravel, так что это было очень полезно – plushyObject

0

Если кто-то происходит Чтобы найти это, это то, что мне в итоге пришлось делать. Я использую Laravel 5.3:

/*Game Model*/ 

public function images() 
{ 
    return $this->morphMany('App\Image', 'imageable'); 
} 

/*Image Model*/ 

public function imageable() 
{ 
    return $this->morphTo(); 
} 

/*Games Controller*/ 

public function index() 
{ 
    $games = Game::with('images')->get(); 

    return $games; 
} 

===================================== 
Here is the JSON it returns: 
{ 
    id: 1, 
    title: "As she said to.", 
    slug: "as-she-said-to", 
    description: "Consequatur at qui iusto.", 
    created_at: "2016-09-29 12:04:36", 
    updated_at: "2016-09-29 12:04:36", 
    images: [ 
     { 
      id: 1, 
      url: "http://www.mobygames.com/images/covers/l/281002-rayman-legends-xbox-one-front-cover.png", 
      imageable_id: 1, 
      imageable_type: "App\Game", 
      created_at: "2016-09-29 12:04:36", 
      updated_at: "2016-09-29 12:04:36" 
     } 
     ] 
    } 

======================================== 
Then in my Vue.js front-end: 

<img v-bind:src="game.images[0].url" class="img-responsive"/> 
+0

Это называется нетерпеливая загрузка, FYI – plushyObject

Смежные вопросы