2016-03-22 21 views
0
<?php 

namespace App\Http\Controllers; 

use App\Clients; 
use Illuminate\Http\Request; 
use App\Http\Requests; 

class AuditsController extends Controller { 

    public function index() { 
     $clients = Clients::distinct()->select('tag')->where('tag', '!=', 'NA')->get(); 
     return view('clients', compact('clients')); 
    } 

    public function show($client) { 
     $machines = Clients::with('machines', 'bios')->where('TAG', $client)->get(); 
     $server = $machines->where('OSNAME', 'LIKE', '%server%')->get(); 

     return view('audit', compact('client'))->with('server', $server); 
    } 

} 

$マシンに参加マシンのリストを作成し、クライアントが、私はこのリストを持っている必要がありました唯一のフィールドOSNAMEのワードサーバーを持つマシンを示し、次のようにIVEはそれをやってみましたが、それはまたやりました動作しませんLaravel雄弁なクエリが

$machines = Clients::with('machines', 'bios')->where('TAG', $client)->where('OSNAME', 'LIKE', '%server%')->get(); 

私は新しいモデルを作成する必要がありますこれを行うための正しいlaravelの方法は何ですか?

クライアント/マシンは、DB内の2つの異なるテーブルを参照します。

答えて

1

使用イーガーローディングフィルタ:

前:

public function show($client) { 
    $machines = Clients::with('machines', 'bios')->where('TAG', $client)->get(); 
    $server = $machines->where('OSNAME', 'LIKE', '%server%')->get(); 

    return view('audit', compact('client'))->with('server', $server); 
} 

public function show($client) { 
    $machines = Clients::with(['machines' => function($query) { 
     //Filter eager loaded relation 
     return $query->where('OSNAME', 'LIKE', '%server%'); 
    }, 'bios'])->where('TAG', $client)->get(); 

    return view('audit', compact('client'))->with('machines', $machines); 
} 

参照してください:https://laravel.com/docs/5.1/eloquent-relationships#constraining-eager-loads

正しい方法(不要なクエリを避ける):

public function show($client) { 
    //Proper way to do it 
    $server = Machine::whereHas('client',function($query) use ($client){ 
     return $query->where('TAG', $client) 
    })->where('OSNAME', 'LIKE', '%server%')->get(); 

    return view('audit', compact('client'))->with('server', $server); 
} 
+0

ありがとう – dev7