2017-05-17 39 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

相关问题