2015-03-29 4 views
0

Я пытаюсь работать с моим ProfilesController, чтобы он возвращал все необходимые мне данные для этого, чтобы я мог передать его моему представлению после его возврата из моей базы данных. При этом метод show в моем контроллере возвращает данные из моей модели User, а затем eagar загружает данные из профиля, я хочу, чтобы он добавлял вложенный массив социальных связей внутри массива профилей.Eagar Загрузка вложенного объекта внутри объекта пользователя

<?php namespace App\Http\Controllers; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use App\User; 

use Illuminate\Http\Request; 

class ProfilesController extends Controller { 

    /** 
    * Display the specified resource. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function show($username) 
    { 
     $user = User::with('profile')->whereUsername($username)->firstOrFail(); 
     return $user; 

     return view('profile', compact('user')); 
    } 

} 

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 

class UserProfile extends Model { 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'user_profiles'; 

    /** 
    * Assigns the relationship between a user proifle and their social links. 
    * 
    * @return mixed 
    */ 
    public function social_links() 
    { 
     return $this->hasOne('App\UserProfileSocialLinks'); 
    } 
} 

Это объект JSON, который возвращает ток.

{ 
    id: 1, 
    created_at: "2015-03-28 21:25:19", 
    updated_at: "2015-03-28 21:25:19", 
    deleted_at: null, 
    profile: { 
     id: 1, 
     user_id: 1, 
     bio: "This is just my personal biography!", 
     created_at: "2015-03-28 21:25:34", 
     updated_at: "2015-03-28 21:25:34", 
     deleted_at: null 
    } 
} 

Я хочу, чтобы объект JSON, чтобы выглядеть как, например:

{ 
    id: 1, 
    created_at: "2015-03-28 21:25:19", 
    updated_at: "2015-03-28 21:25:19", 
    deleted_at: null, 
    profile: { 
     id: 1, 
     user_id: 1, 
     bio: "This is just my personal biography!", 
     created_at: "2015-03-28 21:25:34", 
     updated_at: "2015-03-28 21:25:34", 
     deleted_at: null, 
     social_links { 
      ... 
     } 
    } 
} 

ответ

1

Если вы хотите добавить вложенные отношения, вам нужно указать их в with так:

$user = User::with('profile.social_links')->whereUsername($username)->firstOrFail(); 

Таким образом, вы будете загружать профили, а также social_links для профилей.

В качестве альтернативы вы могли бы создать собственный способ toArray в классе Profile для загрузки всех необходимых отношений.

1

модель отношения не выполняет запрос, но это даст вам доступ к dynamic properties.

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

+0

Я не уверен, что понимаю, как это будет выполнено. – user3732216

+0

Соединения - это то, что вам нужно, задокументировано в [Laravel] (http://laravel.com/docs/5.0/queries#joins), но (другое) ответ с User :: with ('profile.social_links') - возможно, проще. –

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