2016-08-01 10 views
1

Ich habe ein Produkt Modell, das mit Product und ProductOptionValues ​​angeschlossen werden muss Modelle.Laravel Umfang Abfrage mit verschachtelten belongsTo Beziehungen

Die Produkte :: getAll() sollte mit einem JSON zurückgegeben werden, die eine verschachtelte Ansicht der Optionen enthält, die mit dem Produkt verbunden sind, mit den in der Produktoption verbunden Werte Produktoption, auf diese Weise:

products: [ 
    { 
     id: 1, 
     name: "product 1", 
     ... 
     ... 
     options: [ 
      { 
       id: 1, 
       name: "option 1", 
       is_visible: 1, 
       description: "desc", 
       values: [ 
        { 
         id: 1, 
         name: "option value 1", 
         sku: "test 1", 
         description: "desc 1", 
         unitary_price: 5.5 
        }, 
        { 
         id: 2, 
         name: "option value 2", 
         sku: "test 2", 
         description: "desc 2", 
         unitary_price: 5.5 
        } 
       ] 
      }, 
      ... 
      { 
       id: 20, 
       name: "option 20", 
       is_visible: 0, 
       description: "desc 2", 
       values: [ 
        { 
         id: 30, 
         name: "option value 30", 
         sku: "test 30", 
         description: "desc 30", 
         unitary_price: 35.5 
        }, 
        { 
         id: 40, 
         name: "option value 40", 
         sku: "test 40", 
         description: "desc 40", 
         unitary_price: 45.5 
        } 
       ] 
      } 
     ] 
    } 

Also, ich habe zwei verschiedene Tabellen erstellt (Produkttabelle erstellen Migration entfällt)

Produktoptionen Tisch

Schema::create('product_options', function (Blueprint $table) { 
    $table->increments('id'); 

    $table->string('name'); 
    $table->string('slug'); 
    $table->text('description'); 
    $table->boolean('is_visible')->index()->default(0); 

    $table->integer('product_id')->unsigned()->index(); 

    $table->timestamps(); 
    $table->softDeletes(); 
}); 

Produkt-Wahl-Werte Tabelle

Schema::create('product_option_values', function (Blueprint $table) { 
    $table->increments('id'); 

    $table->string('name'); 
    $table->string('sku'); 
    $table->text('description'); 
    $table->boolean('is_default_value')->index()->default(0); 

    $table->integer('product_option_id')->unsigned()->index(); 
    $table->integer('product_id')->unsigned()->index(); 

    $table->decimal('unitary_price', 10, 2); 

    $table->timestamps(); 
    $table->softDeletes(); 
}); 

Produkt-Wahl Modell:

class ProductOption extends Model { 
    use SoftDeletes; 
    use SluggableTrait; 

    protected $dates = ['deleted_at']; 
    protected $guarded = ['id', 'created_at', 'updated_at']; 
    protected $sluggable = [ 
     'build_from' => 'name', 
     'save_to' => 'slug', 
     'include_trashed' => true 
    ]; 

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

    public function productOptionValues() { 
     return $this->hasMany(ProductOptionValue::class); 
    } 

    ... 
    ... 
} 

Produkt-Wahl-Wert Modell:

class ProductOptionValue extends Model { 
    use SoftDeletes; 
    use SluggableTrait; 

    protected $dates = ['deleted_at']; 
    protected $guarded = ['id', 'created_at', 'updated_at']; 

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

    public function productOption() { 
     return $this->belongsTo(ProductOption::class); 
    } 

    ... 
    ... 
} 

Produkt Modell:

class Product extends Model implements SluggableInterface { 
    use SoftDeletes; 
    use SluggableTrait; 

    protected $dates = ['deleted_at']; 
    protected $guarded = ['id', 'created_at', 'updated_at']; 
    protected $sluggable = [ 
     'build_from' => 'name', 
     'save_to' => 'slug', 
     'include_trashed' => true 
    ]; 

    ... 
    ... 

    public function productOptions() { 
     return $this->hasMany(ProductOption::class); 
    } 

    public function productOptionValues() { 
     return $this->hasMany(ProductOptionValue::class); 
    } 

} 

Frage ist, wie kann ich ein Produktobjekt erhalten, die in den JSON-Daten, auch die Option Wert verschachtelt in die „Optionen“ Schlüssel des Produkts enthält? Ich bin schon mit dem scopeWithCompleteData Methode in die Produkte Modell, das von den JSON-API-Handler aufgerufen wird, kann aber nicht verstehen, wie man Nest & Filter die Werte der Optionen und Optionswert einen JSON-Array darstellen wie der, der am Anfang der Frage steht.

Antwort

1

Haben Sie versucht, eifrig zu laden?

Product::with('product_option_values')->get()->toJson()