2016-10-09 3 views
1

Я пытаюсь создать небольшую систему с двумя моделями: Product, ProductPrice.Получите родителя от ребенка в Laravel без дополнительного запроса

Вот модель продукта:

class Product extends Model 
{ 
    protected $with = ['prices']; 

    public $tax_rate = 0.2; 

    public function prices() 
    { 
     return $this->hasMany(ProductPrice::class); 
    } 
} 

Я положил константу tax_rate здесь для большей ясности, но в реальном мире, он обрабатывается другим отношением.

Самое главное здесь в том, что tax_rate является собственностью Product модели

Вот это ProductPrice модель:

class ProductPrice extends Model 
{ 
    protected $appends = ['tax_included_price']; 

    public function getTaxIncludedPriceAttribute() 
    { 
     return (1 + $this->product->tax_rate) * $this->price; 
    } 

    public function product() 
    { 
     return $this->belongsTo(Product::class); 
    } 
} 

Теперь давайте представим, что мне нужно использовать $product->toArray() на некоторых модель. В этом примере я получу цикл исключения для бесконечного цикла, потому что мой метод getTaxIncludedPriceAttribute() делает новый запрос для поиска атрибута product.

Так я мог получить доступ к Product родителей в ProductPrice модели, если я к нему доступ через родителей, и без дополнительного запроса

ответ

0

Итак, я решил проблему с ручной раствором, не уверен но он работает, как будто я хочу, чтобы он работал.

class Product extends Model 
{ 
    protected $with = ['pricesRelation']; 

    protected $appends = ['prices']; 

    public $tax_rate = 0.2; 

    public function pricesRelation() 
    { 
     return $this->hasMany(ProductPrice::class); 
    } 

    public function getPricesAttribute() 
    { 
     $collection = new Collection(); 

     foreach($this->pricesRelation as $relation) { 
      $relation->loadProduct($this); 
      $collection->add($relation); 
     } 

     return $relation; 
    } 
} 

Как вы видите, я запустить $relation->loadProduct($this); определить родителя по отношению без повторного запроса его ...

class ProductPrice extends Model 
{ 
    protected $appends = ['tax_included_price']; 

    protected $loaded_product; 

    public function getTaxIncludedPriceAttribute() 
    { 
     $tax_rate = is_null($loaded_product) ? $this->product->tax_rate : $this->loaded_product->tax_rate; 
     return (1 + $tax_rate) * $this->price; 
    } 

    public function loadProduct (Product $product) 
    { 
     $this->loaded_product = $product; 
    } 

    public function product() 
    { 
     return $this->belongsTo(Product::class); 
    } 
} 
Смежные вопросы