@LaraLover

Laravel как правильно настроить связь?

Есть две таблицы. Первая города:
Schema::create('cities', function (Blueprint $table) {
            $table->increments('id');
            $table->string('slug')->uniqid();
            $table->string('name');
            $table->integer('order');
            $table->timestamps();
        });

Вторая Игроки:
Schema::create('players', function (Blueprint $table) {
            $table->increments('id');
            $table->string('slug')->uniqid();
            $table->string('name');
            $table->integer('cities_id')->unsigned()->index()->nullable();
            $table->foreign('cities_id')->references('id')->on('cities');
            $table->timestamps();
        });

У каждого игрока должен быть 1 город. Т.е. в колонку cities_id я записываю ID города.
Далее в моделях города указываю что может быть много игроков.
class City extends Model
{
    protected $fillable = ['slug', 'name', 'order'];

    public function player(){
        return $this->hasMany('App\Player');
    }
}

У игрока:
class Player extends Model
{
    public function city(){
        return $this->belongsTo('App\City');
    }
}


В контроллере мне надо отдать JSON, чтобы был не ID, а название города. Никак не могу разобраться, помогите пожалуйста :)
Во вьюхе у меня VUE, который через axios получает наш JSON, а дальше уже генерирует html
<template>
        <table class="table table-hover">
            <thead>
            <tr>
                <td>ID</td>
                <td>Slug</td>
                <td>Имя</td>
                <td>Город</td>
            </tr>
            </thead>

            <tbody>
                <tr v-for="player,index in players">
                    <td>{{ player.id }}</td>
                    <td>{{ player.slug }}</td>
                    <td>{{ player.name }}</td>
                    <td>{{ player.cities_id }}</td>                
                </tr>
            </tbody>
        </table>
    </div>
</template>

<script>

    export default {
        data(){
            return{
                players: [],
            }
        },

        created: function()
        {
            this.fetchPlayers();
        },

        methods: {
            fetchPlayers()
            {
              let uri = '/admin/player';
              this.axios.get(uri).then((response) => {
                  this.players  = response.data;
              });
            }
        }
    }
</script>
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@jazzus
Нужно сделать Laravel Resource
для модели Player и для City
с помощью
php artisan make:resource PlayerResource
В файлах прописать поля, какие хочешь получить в json (id, name и т.д.)
Затем переходишь в PlayerResource и подключаешь ресурс отношений в шапке
use App\Http\Resources\CityResource as CityResource;

Далее добавляешь поле отношений в Player:
public function toArray($request)
    {
        return [
             // поля модели, которые нужно отдалть в json
            'id' => $this->id,
            'name' => $this->name,        
            // Отношения
            'cities' => CityResource::collection($this->cities),
            'city' => new CityResource($this->city)
        ];
    }

В контроллере в шапке подключаем
use App\Http\Resources\PlayerResource as PlayerResource;

и передаем json в методе
public function getPlayers()
  {
     $players = Player::with('cities')->get();
     return PlayerResource::collection($players); 
  }

соответственно данный метод фетчишь во VUE или передаешь пропсом в компонент из блейд.
В vue вызываешь, как player.cities или player.city
города должны быть видны в devtools
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Кто на свете всех милее?
Всех румяней и белее?

Правильно, доки! https://laravel.com/docs/5.7/eloquent-serialization

P.S. А конкретнее, в твоём случае, вот эта секция: https://laravel.com/docs/5.7/eloquent-serializatio...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы