2017-05-17 40 views
0

我需要使用Eloquent過濾活動客戶端從路線。Laravel雄辯,從數據透視表列過濾

我正在使用我無法修改的第三方數據庫。在我的項目中,我有兩種模式:客戶端(客戶端)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/>"; 
    } 
} 

,它工作正常,但我不認爲這是優雅的。我知道這可以通過雄辯實現,我只是爲了小事而不知道如何去做。

  1. 也許我可以在clientes加濾網方法對我魯塔模型,這將只返回有效客戶。

  2. 或者,也許這可能是最好添加在Cliente模型的方法,像isDeactivated

我知道這聽起來就像我知道我在說什麼,但我需要有人握住我的手,我只是小聲說:/。例子將不勝感激。

回答

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

我從來沒有聽說過wherePivot的,那就是當你啓動一個項目,而不花時間瞭解你正在使用什麼會發生什麼。正如你所看到的,我實現了我所知道的最快解決方案,所以我可以繼續推進這個項目。謝謝,我的代碼更清潔這種方式:D。 – Adocad

相關問題