2017-08-16 7 views
1

私は多型の関係をフィルタリングする次のクエリがあります。私は、クエリログを有効にするとLaravel 5.2 - クエリビルダ構文多態性の関係をフィルタリングするには?

$companyLogo = $user->company->files->where('file_type', 'Logo')->first(); 

これは私が得るものです:

"query" => "select * from `files` where `files`.`fileable_id` = ? and `files`.`fileable_id` is not null and `files`.`fileable_type` = ?" 
"bindings" => array:2 [▼ 
    0 => 1 
    1 => "App\Company" 
] 

あなたはそれが私を含めていないようにどこの句?

*更新*

これは、会社とファイルモデル間、私が持っているpolymorhpic関係です:

class File extends Model { 

    protected $fillable = [ 
    'name', 
    'path', 
    'size', 
    'mime_type', 
    'file_type', 
    'fileable_id', 
    'fileable_type', 

    ]; 

    public function fileable() 
    { 
     return $this->morphTo(); 
    } 

} 


class Company extends Model { 

    public function files() 
    { 
     return $this->morphMany('App\File', 'fileable'); 
    } 

} 

クエリ研のいずれかwhere句を含めて、なぜ私はよく分かりません。多態性の関係をフィルタリングする構文は正しいですか?企業は異なる種類のファイルを持つことができます。書類、ロゴなどを選択する必要があります。

+2

'file_type'または' fileable_type'? – aynber

+1

また、バインディングに「Logo」も出力されていませんか?彼らが正しい質問であると確信していますか? – Purgatory

+0

あなたのログ内のクエリが質問内のクエリと一致していないようです – chiliNUT

答えて

0

私は次のようにリファクタリングすることにしました:

は、Fileクラスにクエリのスコープを追加しました:次のように

public function scopeCompanyLogo($query, $id) 
{ 
    $query->where('file_type','=', 'Logo') 
     ->where('fileable_type','=', 'App\Company') 
     ->where('fileable_id','=', $id); 
} 

は現在、同社のロゴを取得:

$companyLogo = File::CompanyLogo($user->company_id)->first(); 

*更新*

ワロンあまりにも元のコードとグラム

の代わりにこれをやって:

$companyLogo = $user->company->files->where('file_type', 'Logo')->first(); 

それはされている必要があります。

$companyLogo = $user->company->files()->where('file_type', 'Logo')->first();