2017-01-31 1 views
0

Я прошу всех данных о спортсменах из вызова api, как это, и все идет отлично.Laravel: Как я могу вернуть массив внутри коллекции?

MyController.php

public function get($year, $position_id) 
{ 
    $collection = collect(
     $athletes = Athlete::where('athletes.graduation_year', $year) 
      ->join('athlete_position', 'athlete_position.athlete_id', '=', 'athletes.id') 
      ->where('athlete_position.position_id', '=', $position_id) 
      ->join('evaluations', 'evaluations.athlete_id', 'athletes.id') 
      ->whereNotNull('evaluations.comments') 
      ->where('evaluations.status', 'published') 
      ->orderBy('rank', 'asc') 
      ->orderBy('rating', 'asc') 
      ->orderBy('last_name', 'asc') 
      ->get() 
    )->groupBy('rating'); 

    return response()->json(['data' => $collection], 200); 
} 

Теперь я хотел бы, чтобы добавить свою таблицу оферты этому присоединиться:

... 
->join('evaluations', 'evaluations.athlete_id', 'athletes.craft_id') 
->whereNotNull('evaluations.comments') 
->where('evaluations.status', 'published') 
->join('offers', 'offers.athlete_id', 'athletes.craft_id') 
... 

Который работает, но теперь я получаю дубликаты спортсменов; по одному для каждого предложения. Например, если у спортсмена три предложения, я получу одного и того же спортсмена три раза - один раз для каждого предложения.

Что бы я хотел, это массив предложений в коллекции. Нечто подобное выглядит следующим образом:

$athlete { 
    ... 
    'evaluation': '<p>My evaluation...</p>', 
    'offers': [ 
     {'school': '<p>Clemson</p>','committed': 1}, 
     {'school': '<p>Alabama</p>', 'committed': 0} 
    ] 
    ... 
} 

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

Мои модели выглядят следующим образом:

Athlete.php

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

Offer.php

public function athletes() 
{ 
    return $this->belongsToMany('App\Athlete'); 
} 

Все данные должным образом возвращается в течение моего приложения - это просто вызов API - это то место, где я борюсь.

Благодарим за любые предложения!

EDIT

Вот что мои выберите выглядит сейчас:

$collection = collect(
     $athletes = DB::table('athletes')->select('craft_id', 'first_name', 'last_name', 'email', 'high_school_state', 'graduation_year', 'rank', 'rating', 'evaluations.comments', 'offers.school') 
      ->where('athletes.graduation_year', $year) 
      ->join('athlete_position', 'athlete_position.athlete_id', '=', 'athletes.craft_id') 
      ->where('athlete_position.position_id', '=', $position_id) 
      ->join('evaluations', 'evaluations.athlete_id', 'athletes.craft_id') 
      ->whereNotNull('evaluations.comments') 
      ->where('evaluations.status', 'published') 
      ->join('offers', 'offers.athlete_id', 'athletes.craft_id') 
      ->orderBy('rank', 'asc') 
      ->orderBy('rating', 'asc') 
      ->orderBy('last_name', 'asc') 
      ->get() 
    )->groupBy('rating'); 

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

"data": { 
    ... 
    { 
    "first_name": "Tyler", 
    "last_name": "Durden", 
    "offers": "Clemson" 
    }, 
    { 
    "first_name": "Tyler", 
    "last_name": "Durden", 
    "offers": "Alabama" 
    }, 

Я пытаюсь получить:

"data": { 
... 
    { 
    "first_name": "Tyler", 
    "last_name": "Durden", 
    "offers": [ 
     "school": "Clemson" 
     "school": "Alabama" 
    ] 
    }, 

ответ

0

С такими сложными запросами лучше всего использовать метод

->select('athletes.*') etc 

, что избавит вас от дублирования

documentation

+0

Я не думаю, что я низкий. Я обновил свой вопрос, чтобы попытаться показать, что я изменил, чтобы попробовать ваше предложение. – Damon