2015-08-31 4 views
1

У меня есть это не просто код на мой контроллер:Как сделать компактный код Laravel 5 Красноречивые Отношения

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\User; 
use App\UserDetail; 
use App\UserSex; 
use App\Province; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 

class UserController extends Controller { 

... 

public function show($id) { 
     // 
     $User = User::find($id); 
     $UserDetail = User::find($id)->UserDetail; 
     $UserSex = User::find($id)->UserSex; 
     $Province = User::find($id)->Province; 
     return view('users.show', compact('UserDetail', 'User', 'UserSex', 'Province')); 
    } 

... 

Этот код на одном из моих модели:

namespace App; 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

... 

protected $hidden = ['password', 'remember_token']; 
    public $timestamps = false; 

    public function UserDetail() { 
     return $this->hasOne('App\UserDetail', 'userDetail_id'); 
    } 

    public function UserSex() { 
     return $this->hasOne('App\UserSex', 'sex_id'); 
    } 

    public function Province() { 
     return $this->hasOne('App\Province', 'province_id'); 
    } 

... 

И это код на вид:

<div class="form-group"> 
     <label for="isbn" class="col-sm-2 control-label">User Name</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="isbn" placeholder="{!! $User->username !!}" readonly> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="title" class="col-sm-2 control-label">Full Name</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="firstName" placeholder="{!! $UserDetail->firstName !!} {!! $UserDetail->lastName !!}" readonly> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="publisher" class="col-sm-2 control-label">Sex</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="sex" placeholder="{!! $UserSex->gender !!}" readonly> 
     </div> 
    </div> 

Как вы видите в моем контроллере, я вызываю каждую функцию в модели (return view ('users.show', compact ('UserDetail', 'User', 'UserSex', 'Province'));), чтобы показать данные между таблицей в Отношения с потребителем.

У меня нет ошибок, чтобы сделать код вроде этого, и это хорошо работает.

Мой вопрос: я делаю это правильно (база на Laravel 5)?

Потому что я думаю, что этот метод не просто, не компактна если я много таблицы позже. Я до сих пор не изучил все функции laravel. Может быть, некоторые из вас могут помочь мне исправить это.

+0

Я думаю, что я сделал ошибку на мой контроллер ** Показать ** Функция о параметре ($ ID). Теперь это еще больше смущает меня. – wahyueka31

+0

В чем причина того, что вы добавили UserSex и провинцию в отдельные модели? – yangqi

+0

@yangqi Нет причин для их разделения, я просто следую официальной документации Laravel 5.1 здесь: http://laravel.com/docs/5.1/eloquent-relationships. Я ошибаюсь? – wahyueka31

ответ

1

Прежде всего ваш метод & имена переменных должны быть верблюд случай см http://www.php-fig.org/psr/psr-1/#4-2-properties & http://www.php-fig.org/psr/psr-2/#4-3-methods

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\User; 
use App\UserDetail; 
use App\UserSex; 
use App\Province; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 

class UserController extends Controller { 

... 

public function show($id) { 
     // 
     $user = User::find($id); 
     $userDetail = User::find($id)->userDetail; 
     $userSex = User::find($id)->userSex; 
     $province = User::find($id)->province; 
     return view('users.show', get_defined_vars()); 
    } 

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

изменить Также ваши имена методов для ГорбатыйРегистр

namespace App; 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

... 

protected $hidden = ['password', 'remember_token']; 
    public $timestamps = false; 

    public function userDetail() { 
     return $this->hasOne('App\UserDetail', 'userDetail_id'); 
    } 

    public function userSex() { 
     return $this->hasOne('App\UserSex', 'sex_id'); 
    } 

    public function province() { 
     return $this->hasOne('App\Province', 'province_id'); 
    } 

Измените переменные в представлении

<div class="form-group"> 
     <label for="isbn" class="col-sm-2 control-label">User Name</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="isbn" placeholder="{!! $user->username !!}" readonly> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="title" class="col-sm-2 control-label">Full Name</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="firstName" placeholder="{!! $userDetail->firstName !!} {!! $userDetail->lastName !!}" readonly> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="publisher" class="col-sm-2 control-label">Sex</label> 
     <div class="col-sm-10"> 
      <input type="text" class="form-control" id="sex" placeholder="{!! $userSex->gender !!}" readonly> 
     </div> 
    </div> 

Follow PSR-2 — Coding Style Guide

Также попробуйте использовать жадную загрузку, как это решает запрос n + 1 проблема & предел ваш выбор

Я предпочел бы написать этот код в контроллере для $user переменной

$user = User::with(['userDetail' => function($q){ 
    $q->select(['id', 'firstName', 'lastName']); 
}, 'userSex' => function($q){ 
    $q->select(['id', 'gender']); 
}])->findOrFail($id); 

и на ваш взгляд

<div class="form-group"> 
    <label for="isbn" class="col-sm-2 control-label">User Name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" id="isbn" placeholder="{!! $user->username !!}" readonly> 
    </div> 
</div> 
<div class="form-group"> 
    <label for="title" class="col-sm-2 control-label">Full Name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" id="firstName" placeholder="{!! $user->userDetail->firstName !!} {!! $user->userDetail->lastName !!}" readonly> 
    </div> 
</div> 
<div class="form-group"> 
    <label for="publisher" class="col-sm-2 control-label">Sex</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" id="sex" placeholder="{!! $user->userSex->gender !!}" readonly> 
    </div> 
</div> 

Всегда ограничивать ваши се Lect & ненужные присоединяется, как это может быть дорогим

+0

Hei ** @ ARIF MAHMUD RANA **, ваш скрипт контроллера замечательный. Большое спасибо. – wahyueka31

0

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

$user=User::find($id)->with('UserDetail')->with('UserSex')->with('Province'); 

return view('users.show')->with('user',$user); 

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

Для справки Eloqouent - Eager Loading

+0

Ваш код дает мне эту ошибку ** «ОшибкаException в ca765b7a3065caff5ad7ab75ad6380bb строка 15: Undefined property: Illuminate \ Database \ Eloquent \ Builder :: $ username (Вид: C: \ wamp \ www \ bookstore \ resources \ views \ users \ show .blade.php) "** Я думаю, что мой столбец таблицы не определяется с помощью этого (** $ username ** находится в моем представлении **" {!! $ user-> username !!} "**) – wahyueka31

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