2013-06-07 14 views
25

私はlaravelでモデルを熱心に読み込もうとしていますが、特定の列のみを返します。私は熱心に載せられたテーブル全体を提示したくありません。Laravel Eager Loading - 特定の列のみをロードする

public function car() 
{ 
    return $this->hasOne('Car', 'id')->get(['emailid','name']); 
} 

私は、次のエラーを取得しています:

log.ERRORを:メッセージと例外 'のSymfony \コンポーネント\デバッグ\例外の\ FatalErrorException'「は雄弁\コレクション\未定義のメソッドを照らし\ Databaseへの呼び出し:: getAndResetWheres()」select()方法の

+0

- >を取得([ 'COLを'、 'C​​OL2'、 'C​​OL3']); –

答えて

49

メイクの使用:

public function car() { 
    return $this->hasOne('Car', 'id')->select(['owner_id', 'emailid', 'name']); 
} 

注:両方のテーブルに一致する外部キーに割り当てられた列を追加することを忘れないでください。例えば、私の例では、私はOwnerが外部キーに割り当てられている列がowners.id = cars.owner_idのようなものになるだろうことを意味し、Carを持っていると仮定ので、私は、選択した列のリストにowner_idを追加する必要がありました。

+1

残念ながらそれは私のために働いていません。 select()メソッドを追加すると、関係は追加されません。私はそれを削除する場合、私は行全体を取得します。 – ipengineer

+8

ああ、おそらく外部キーも使われている必要があります。例えば、 'id'ならば、' select() '列に' id'を追加する必要があります。 – rmobis

+1

元の回答を更新しました。今すぐ確認してください。基本的に 'Owner - > Car'関係が' owners.id - > cars.owner_id'に設定されている場合、 'select()'列リストに 'owner_id'を追加する必要があります。 – rmobis

7

また、あなたはあなたがあなたがそれを必要なときにそれを行うことができます...モデルとの関係方法自体に特定の列を取得して指定する必要はありません...このように:

$owners = Owner:: 
      with([ 
      'car' => function($q) 
      { 
      $q->select('id', 'owner_id', 'emailid', 'name'); 
      }, 
      'bike' => function($q) 
      { 
      $q->select('id', 'owner_id', 'emailid', 'name'); 
      } 
      ])-> 
      get(); 

このように、これまでに必要なことがあれば、関連するモデルのすべての列を取得することもできます。

あなたは

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Car extends Model 
{ 
    protected $table = 'car'; 

    public function owner() 
    { 
     return $this->belongsTo('App\Owner', 'owner_id'); 
    } 
} 

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Owner extends Model 
{ 
    protected $table = 'owner'; 

    public function car() 
    { 
     return $this->hasMany('App\Car', 'owner_id'); 
    } 
} 

以下のように定義された2つのモデルがあり、二つのテーブルに何かを持っていると仮定すると

App\Car::with('owner:id,name,email')->get(); 

のような何かをしなければならない、あなたのコントローラで

+0

これは、特定の制約に一致する列を持つ熱い行を読みたい場合にも、 '$ q-> where()'のために働くということを付け加えたいと思います。 – WhyAyala

2

like:

owners: id | name | email | phone | other_columns... 

cars: id | owner_id | make | color | other_columns... 

クレジットはドキュメントにアクセスしてください:eloquent-relationships#eager-loadingスクロールへの積極的なロード特定の列

関連する問題