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 实现,我只是菜鸟,不知道该怎么做。
也许我可以在我的 Ruta 模型的 clientes 方法上添加过滤器,这样它会 return 只有活跃的客户。
或者最好在 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');
}
我需要使用 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 实现,我只是菜鸟,不知道该怎么做。
也许我可以在我的 Ruta 模型的 clientes 方法上添加过滤器,这样它会 return 只有活跃的客户。
或者最好在 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');
}