Laravel Eloquent,从数据透视表列

时间:2017-05-17 19:04:03

标签: laravel eloquent laravel-5.4 laravel-eloquent

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

我正在使用我无法修改的第三方数据库。在我的项目中,我有两个模型: Cliente(客户端) Ruta(路由),它们具有多对多关系,因此我在模型中添加了belongsToMany关系。

我对数据透视表感兴趣的唯一一列名为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');
    }
}

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. 也许我可以在 Ruta 模型上的 clientes 方法中添加过滤器,因此它只返回活动的客户端。

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

  3. 我知道这听起来像是我知道我在说什么,但是我需要有人握住我的手,我只是对Eloquent太棒了:/。举例非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用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');
}