Laravel Eloquent,从数据透视表列中过滤

Ado*_*cad 1 laravel eloquent laravel-5.4

我需要使用 Eloquent 从路由中过滤活动客户端。

我正在使用无法修改的第三方数据库。在我的项目中,我有两个模型:Cliente(client)Ruta(route),它们具有多对多关系,因此我在模型中添加了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');
    }
}
Run Code Online (Sandbox Code Playgroud)

客户型号:

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是获取给定特定路由的活动(或非停用)客户端。

我在我的控制器上这样做了,如下所示:

$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/>";
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我不认为它很优雅。我知道这可以通过 Eloquent 来实现,我只是对它很菜鸟,不知道该怎么做。

  1. 也许我可以在我的Ruta模型上的clientes方法上添加过滤器,这样它只会返回活动的客户端。

  2. 或者也许最好在Cliente模型上添加一个方法,例如isDeactivated

我知道听起来我知道我在说什么,但我需要有人来帮我解决这个问题,我对 Eloquent 太菜鸟了:/。例子将非常感激。

use*_*496 6

您可以使用该wherePivot方法根据数据透视表中的值来约束关系。您只需将以下内容添加到您的Ruta模型中

public function desactivClientes() {
    return $this->clientes()->wherePivot('DESACTIV', 0);
}
Run Code Online (Sandbox Code Playgroud)

然后您只需稍微修改其余代码即可使用约束关系。我还添加了一个 null 检查,因为如果此函数确实返回 null(如果您的表没有CODIRUTA与 中的任何内容匹配的记录$ruta,则可能会发生这种情况),那么尝试在非对象上调用方法时可能会引发致命错误-目的。

$miRuta = Ruta::where('CODIRUTA','=',$ruta)->first();
$clientes = array();
if ($miRuta !== null) {
    $clientes = $miRuta->desactivClientes()->pluck('NOMBCLIE');
}
Run Code Online (Sandbox Code Playgroud)