2016-12-20 1 views
0

는 Laravel 5.3을 사용하여, 나는 type 문자 속성 값의 값에 따라 belongsToMany 또는 hasMany 관계를 반환 내 Order 웅변 모델의 방법을 읽을 수 없습니다 .조건부 웅변 관계는 쓸 수 있지만 (열망로드)

Order은 그 자체가 일대 다 관계로 MasterOrder 모델의 하위 모델입니다.

    --------------- 
       * MasterOrder * 
       -------+------- 
         | 
         O2M        
         | 
     +----------------+------------------+ 
     |    |     | 
    ----+-------  ----+-------  -----+------ 
    * Order *  * Order *  * Order * 
    * Type = O *  * Type = C *  * Type = S * 
    -+----------  -+----------  -+---------- 
    |  Offer  |CreditPack  | Shipment 
    |    |     | 
    M2M    M2M    O2M 

Order 모델의 관계는 내 items() 방법을 사용하여 내가 attach() 제공 및 신용 팩 및 create() 출하량 수 있어요 데이터를 삽입하고이없이 작동 할 때

public function items() 
{ 
    $types = [ 
     'S' => Shipment::class, 
     'O' => Discount::class, 
     'C' => CreditPack::class 
    ]; 

    if ($this->type == 'C') { 
     return $this->belongsToMany($types['C'], 'credit_pack_order') 
      ->withTimestamps(); 
    } 

    if ($this->type == 'O') { 
     return $this->belongsToMany($types['O'], 'discounts') 
      ->withTimestamps(); 
    } 

    return $this->hasMany($types[$this->type]); 
} 

다음 어떤 문제. 데이터가 데이터베이스에 유지되고 모든 것이 필요합니다.

문제는 내가 MasterOrder 모델 (데이터를 삽입 할 때부터 시작 함)에서 시작하여 내 관계를로드하고자하는 경우 items()을 읽을 수 없다는 것입니다.

나는 MasterOrder에서 열망로드를 Order 데이터를 읽을 수 있지만,이 items()를로드 할 때이 Order 특성을 읽을 수 없습니다처럼 는 것 같다.

Order에서 시작하면 대신 읽을 수 있습니다.

모든 주문에 대해 데이터베이스를 두 번 쿼리하지 않도록 할 수있는 방법이 있습니까?
아무도 설명해 주시겠습니까?

+1

를 사용하여 데이터를 검색 -이 :

의 관계가된다 관계 설정에 조건을 사용한다는 사실을 암시합니다. – Oddman

+0

@Oddman 할 수 없습니다. 관계 중 하나가 다른 것과 다릅니다. '선적 (Shipment) '은 일대 다 (one to many)를 요구하는 반면, 다른 것들은 다 대다 (many to many) 다. – phaberest

+1

두 가지 방법 중 하나가 있습니다. 각 관계에 대해 별도의 메서드를 사용하거나 (선호하는 메서드) 다형 관계를 사용하여 모든 방식으로 처리합니다. 문제는 item()이 다른 개체 컬렉션을 반환한다는 것이며 도메인 경계 문제입니다. 그렇게해서는 안됩니다. – Oddman

답변

0

나는 결국 이탈리아 개발자 인 Facebook 그룹에서이 문제에 관해 이야기하면서 해결 방법을 발견했습니다.

실제로 함수의 인수로 어떤 순서로 나오는 지 type이 무엇인지 방법을 알 수 있습니다. 이렇게하면 속성을로드하지 않아도 답변을 얻을 수 있습니다.

public function items($type = null) 
{ 
    if ($type != null) { 
     $this->type = $type; 
    } 

    $types = [ 
     'S' => Shipment::class, 
     'O' => Discount::class, 
     'C' => CreditPack::class 
    ]; 

    if ($this->type == 'C') { 
     return $this->belongsToMany($types['C'], 'credit_pack_order') 
      ->withTimestamps(); 
    } 

    if ($this->type == 'O') { 
     return $this->belongsToMany($types['O'], 'discounts') 
      ->withTimestamps(); 
    } 

    return $this->hasMany($types[$this->type]); 
} 

당신이 당신의 모델 다형성의 관계를 이용하여보고 할 수 있습니다 것처럼 나는 그것은 나에게 보이는

$masterorder = auth()->user()->orders()  // orders() is a User->MasterOrder 
    ->where('reference', '=', $reference)  // hasMany relation 
    ->first(); 

$details = $masterorder->orders()->get() 
    ->map(function ($order) { 
     $order->items = $order->items($order->type)->get()->toArray(); 
     return $order; 
    }); 
+1

나는 여기서하고있는 일을 바꿀 것을 강력히 권고한다 - 이것은 3 개의 분리 된 관계이며 그렇게 취급되어야한다. – Oddman

+0

나는 당신이 의미하는 바를 이해하고 그 제안에 대해 감사 드린다. 그러나 나는 결과물을 제복을 입었고 나는이 경우 솔리드를 깨뜨리지 않는다. 가까운 장래에 리팩토링을 할 것입니다. – phaberest

+0

SOLID를 어지럽 혔습니까? – Oddman