2017-05-17 14 views
0

私はEloquentを使用してルートからアクティブなクライアントをフィルタリングする必要があります。Laravel Eloquent、ピボットテーブルの列からフィルタリングする

私は変更できないサードパーティのデータベースを使用しています。私のプロジェクトでは、Cliente(クライアント)Ruta(ルート)があります。これは多対多の関係を持っていますので、モデルにbelongsToMany関係を追加しました。

私がピボットテーブルから興味を持っている唯一の列はDESACTIVと呼ばれ、クライアントがルートに対して非アクティブ化されているかどうかを教えてくれます。

ルタモデル:

class Ruta extends Model 
{ 
    protected $connection = 'mysql2'; 
    protected $table = 'truta'; 
    protected $primaryKey = 'CODIRUTA'; 

    public function clientes(){ 
     return $this->belongsToMany(Cliente::class, 'tcpcarut', 'CODIRUTA', 'CODICLIE')->withPivot('DESACTIV'); 
    } 
} 

Clienteモデル:

class Cliente extends Model 
{ 
    protected $connection = 'mysql2'; 
    protected $table = 'tcpca'; 
    protected $primaryKey = 'CODICLIE'; 

    public function rutas(){ 
     return $this->belongsToMany(Ruta::class, 'tcpcarut', 'CODICLIE', 'CODIRUTA')->withPivot('DESACTIV'); 
    } 
} 

私は必要なものは、特定のルート所定の活性(または非無効)クライアントを取得することです。私はこのように私のコントローラ上でそれを行っている

$miRuta = Ruta::where('CODIRUTA','=',$ruta)->first(); 
$clientes = array(); 
foreach ($miRuta->clientes as $cliente){ 
    if ($cliente->DESACTIV == 0){ 
     array_push($clientes, $cliente->NOMBCLIE); 
     echo end($clientes)."<br/>"; 
    } 
} 

そして、それが正常に動作しますが、私はそれはエレガントだとは思いません。私はこれがEloquentを通して実現できることを知っています、私はそれにノブをつけて、それをやる方法を知らないだけです。

  1. それが唯一のアクティブなクライアントを返しますので、たぶん私は、私のルタモデルにclientes方法でフィルタを追加することができます。

  2. それともそれはは私が話しているか知っているよう

が、私はそれが音を知ってisDeactivatedのように、Clienteモデルにメソッドを追加することが最善かもしれないが、私は誰かを必要とします私の手をこれにつけるために、私はEloquentとあまりにも戸惑っています:/。例は非常に高く評価されるだろう。

答えて

1

wherePivotメソッドを使用すると、ピボットテーブルの値に基づいてリレーションシップを制約できます。あなたは自分のRutaモデル

public function desactivClientes() { 
    return $this->clientes()->wherePivot('DESACTIV', 0); 
} 

に以下を追加する必要があります。そして、あなただけの制約された関係を使用するようにコードの残りの部分を少し変更する必要があります。また、ヌルチェックを追加しています。なぜなら、この関数がnullを返すと、CODIRUTA$rutaに一致するレコードがテーブルにない場合に発生する可能性があるため、メソッドを呼び出すときに致命的なエラーが発生する可能性があるからです非オブジェクトです。

$miRuta = Ruta::where('CODIRUTA','=',$ruta)->first(); 
$clientes = array(); 
if ($miRuta !== null) { 
    $clientes = $miRuta->desactivClientes()->pluck('NOMBCLIE'); 
} 
+0

私はどこのピボットについて聞いたこともありません。それは、あなたが作業していることを知る時間を取らずにプロジェクトを開始したときに起こります。あなたが見たように私は自分の知るところで最も速い解決策を実装しましたので、プロジェクトを進めていくことができました。ありがとう、私のコードはこの方法ではるかにクリーンです:D。 – Adocad

関連する問題