2015-09-15 3 views
0

Я пытаюсь сделать выбор с помощью определенных таблиц в базе данных.PHP Laravel 5.1 - Красноречивый выбор с использованием «with()» не работает

Здесь модель "Funcionario":

class Funcionario extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'funcionarios'; 


    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['nome', 'matricula', 'pis_pasep', 'data_admissao', 'data_demissao', 'data_nascimento', 'apelido', 'sexo_id', 'setor_id', 'cargo_id', 'turno_id']; 

    /** 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function cargo() 
    { 
     return $this->belongsTo('App\Cargo'); 
    } 

} 

Вот "Cargo" Модель:

class Cargo extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'cargos'; 


    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['nome']; 

    /** 
    * Belongs to 'funcionarios' relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function funcionario() 
    { 
     return $this->hasMany('App\Funcionario'); 
    } 
} 

Это то, что я пытаюсь в настоящее время:

public function showMyEmployees(){ 

     $data = Funcionario::where('supervisor_id', $user->id) 
      ->with([ 
       'cargo' => function($query){ 
        $query->select('nome'); // $query->pluck('nome'); // $query->get(['nome']); 
       } 
      ]) 
      ->orderBy('nome') 
      ->get(); 

     return response()->json($data, 200); 
    } 

Что Я получаю:

{ 
    "id": 1648, 
    "nome": "ADOLFO ARAUJO DOS SANTOS JUNIOR", 
    "matricula": 14311, 
    "pis_pasep": 0, 
    "data_admissao": "1970-01-01", 
    "data_demissao": "1970-01-01", 
    "data_nascimento": null, 
    "apelido": null, 
    "supervisor_id": 1105, 
    "coordenador_id": null, 
    "gerente_id": null, 
    "diretor_id": null, 
    "sexo_id": null, 
    "setor_id": 36, 
    "cargo_id": 56, 
    "turno_id": null, 
    "created_at": "2015-09-15 14:49:32", 
    "updated_at": "2015-09-15 15:58:36", 
    "cargo": null 
    } 

И «груз» должен иметь значение, не равное нулю.

Если я не использую закрытие в избранном красноречии, он возвращается с «ном» в «груз».

Как это:

{ 
    "id": 1648, 
    "nome": "ADOLFO ARAUJO DOS SANTOS JUNIOR", 
    "matricula": 14311, 
    "pis_pasep": 0, 
    "data_admissao": "1970-01-01", 
    "data_demissao": "1970-01-01", 
    "data_nascimento": null, 
    "apelido": null, 
    "supervisor_id": 1105, 
    "coordenador_id": null, 
    "gerente_id": null, 
    "diretor_id": null, 
    "sexo_id": null, 
    "setor_id": 36, 
    "cargo_id": 56, 
    "turno_id": null, 
    "created_at": "2015-09-15 14:49:32", 
    "updated_at": "2015-09-15 15:58:36", 
    "cargo": { 
     "id": 56, 
     "nome": "AUXILIAR DE PRODUCAO", 
     "created_at": "2015-09-15 14:47:18", 
     "updated_at": "2015-09-15 14:47:18" 
    } 

..И это то, что я хочу:

{ 
    "id": 1648, 
    "nome": "ADOLFO ARAUJO DOS SANTOS JUNIOR", 
    "matricula": 14311, 
    "pis_pasep": 0, 
    "data_admissao": "1970-01-01", 
    "data_demissao": "1970-01-01", 
    "data_nascimento": null, 
    "apelido": null, 
    "supervisor_id": 1105, 
    "coordenador_id": null, 
    "gerente_id": null, 
    "diretor_id": null, 
    "sexo_id": null, 
    "setor_id": 36, 
    "cargo_id": 56, 
    "turno_id": null, 
    "created_at": "2015-09-15 14:49:32", 
    "updated_at": "2015-09-15 15:58:36", 
    "cargo": "AUXILIAR DE PRODUCAO" 
} 

Спасибо!

ответ

2

Вам нужно добавить «id» к вашему выбору(), как красноречиво нужно его для сравнения. Я думаю, вам лучше не использовать красноречие в этом случае, так как вы просто хотите вернуть строку для ключа груза.

DB::table('funcionarios') 
    ->join('cargos', 'cargos.id', '=', 'funcionarios.cargo_id') 
    ->get(['funcionarios.*', 'cargos.nome AS cargo']); 
+0

Я пытался избежать использования класса DB ... Я думаю, что лил загрязнен (личное мнение). В любом случае, я собираюсь использовать цикл foreach. Что-то вроде «foreach ($ resultado as $ it) {$ it-> cargo = $ it-> cargo-> nome;}". –

+0

Согласен. Красноречивый - это потрясающе, но он не может сделать все, поэтому (не) часто вы окажетесь в ситуации, когда вам нужно использовать фасад БД. –

+0

В любом случае ваш ответ работает! UP! Спасибо, Крис! –

0

Как я хотел избежать DB класса фасад, я решил использовать Еогеасп петлю поставить новое значение в «груза».

Это будет как:

public function showMyEmployees(){ 

    $data = Funcionario::where('supervisor_id', $user->id) 
     ->orderBy('nome') 
     ->get(); 

    $funcionarios = array(); 
    foreach($data as $funcionario){ 
     $funcionario->cargo = $funcionario->cargo()->pluck('nome'); 
     $funcionario->setor = $funcionario->setor()->pluck('nome'); 

     array_push($funcionarios, $funcionario); 
    } 

    return response()->json($funcionarios, 200); 
} 
+0

Это не очень хорошая практика, Лео. На каждую итерацию вы запускаете 2 новых запроса. Рассмотрите ленивую загрузку ваших отношений: '$ data-> load ('cargo', 'setor');' или нетерпеливая загрузка, как вы это делали ранее. –

+0

Это правда. На самом деле, я никогда не использовал метод load(). Я попробую. Еще раз спасибо, Крис! –

+0

Эй, Крис, я пробовал, но ответ был JSON для «груза», а не строки (чего я действительно хотел). Вместо {«груз»: «Что-то»}, у меня есть «груз»: {«id»: 99, «nome»: «Что-то», «created_at»: «2015-09-15 ...» }}. Я просто хотел «ном» значение «груза». –

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