我需要使用 Eloquent 从路由中过滤活动客户端。
我正在使用无法修改的第三方数据库。在我的项目中,我有两个模型:Cliente(client)和Ruta(route),它们具有多对多关系,因此我在模型中添加了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');
}
}
客户型号:
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 来实现,我只是菜鸟,不知道该怎么做。
也许我可以在我的 Ruta 模型上的 clientes 方法上添加过滤器,这样它只会返回活动客户端。
或者也许最好在 Cliente 模型上添加一个方法,例如 isDeactivated
我知道听起来我知道我在说什么,但我需要有人帮我解决这个问题,我对 Eloquent 太菜鸟了:/。示例将非常感激。
您可以使用
wherePivot
方法来约束基于数据透视表中的值的关系。 您只需将以下内容添加到您的 Ruta
模型
public function desactivClientes() {
return $this->clientes()->wherePivot('DESACTIV', 0);
}
然后您只需稍微修改其余代码即可使用约束关系。 我还添加了一个 null 检查,因为如果这个函数确实返回 null,如果您的表没有
CODIRUTA
与 $ruta
中的任何内容匹配的记录,则可能会发生这种情况,那么它可能会抛出致命错误调用非对象的方法。
$miRuta = Ruta::where('CODIRUTA','=',$ruta)->first();
$clientes = array();
if ($miRuta !== null) {
$clientes = $miRuta->desactivClientes()->pluck('NOMBCLIE');
}