2017-05-17 1 views
0

Eloquent를 사용하는 경로에서 활성 클라이언트를 필터링해야합니다.Laravel Eloquent, 피봇 테이블 열에서 필터링

수정할 수없는 타사 데이터베이스로 작업하고 있습니다. 내 프로젝트에는 두 가지 모델이 있습니다 : Cliente (클라이언트)Ruta (경로), many to many 관계가 있으므로 내 모델에 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'); 
    } 
} 

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/>"; 
    } 
} 

그리고 그것은 잘 작동하지만 나는 그것이 우아한 생각하지 않습니다. 나는 이것이 황홀함을 통해 성취 될 수 있다는 것을 안다, 나는 그것에 멍한 틈에 다만이고 그것을하는 방법을 모른다. 그것은 단지 활성 클라이언트를 반환 있도록

  1. 은 어쩌면 내가, 내 루타 모델에 clientes에 방법을 필터를 추가 할 수 있습니다.

  2. 아니면 그것은 나는 내가 무슨 말을하는지 알처럼

내가 그것을 소리로 들리 겠지만 isDeactivated처럼 Cliente 모델에 메소드를 추가하는 것이 최선이 될 수 있지만 사람이 필요합니다 내 손을 잡으려고, 나는 너무 멍청한 놈이다. 예를 들어 주시면 감사하겠습니다.

답변

1

wherePivot 메서드를 사용하면 피벗 테이블의 값을 기반으로 관계를 제한 할 수 있습니다. 당신은 당신의 Ruta 모델

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

에 다음 그리고 당신은 단지 제한된 관계를 사용하는 비트 코드의 나머지 부분을 수정해야 할 추가해야합니다. 또한이 함수가 널을 반환하는 경우 테이블에 레코드가 없으면 CODIRUTA$ruta에있는 것과 일치하므로 null 치를 추가하기 때문에 메서드 호출을 시도 할 때 치명적인 오류가 발생할 수 있습니다. 비 개체.

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

필자는 어디에서 일인지 들어 본 적이 없었습니다. 사용자가 작업하는 것을 알기 위해 시간을 들이지 않고 프로젝트를 시작할 때 일어나는 일입니다. 당신이 보았 듯이, 내가 아는 한 가장 빠른 해결책을 구현 했으므로 프로젝트를 계속 진행할 수있었습니다. 고마워, 내 코드는 이런 식으로 훨씬 더 깨끗하다. D. – Adocad