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

Laravel Eloquent, filtering from pivot table column

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

我正在使用无法修改的第三方数据库。在我的项目中,我有两个模型:Cliente(client)Ruta(route),它们具有多对多关系,所以我添加了我模型中的 belongsToMany 关系。

我对数据透视表 table 感兴趣的唯一一列称为 DESACTIV,它告诉我客户是否为路由停用。

Ruta 型号:

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');
    }
}

客户模型:

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. 也许我可以在我的 Ruta 模型的 clientes 方法上添加过滤器,这样它会 return 只有活跃的客户。

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

我知道这听起来好像我知道我在说什么,但我需要有人支持我,我对 Eloquent 太菜鸟了:/。示例将不胜感激。

您可以使用 wherePivot 方法根据枢轴 table 中的值来约束关系。您只需将以下内容添加到您的 Ruta 模型

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

然后您只需稍微修改其余代码即可使用约束关系。我还添加了一个空检查,因为如果这个函数确实 return null,如果你的 table 没有 CODIRUTA 匹配 [=15= 中的任何内容的记录,就会发生这种情况]],那么它可能会在尝试调用非对象上的方法时抛出致命错误。

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