Hubungan yang fasih dalam tabel pivot khusus

Saya mungkin terlalu memperumit masalah, tapi inilah hubungan yang saya coba tulis di Eloquent (Laravel 5):

Saya memiliki daftar produk dan daftar harga. Setiap produk dapat memiliki banyak daftar harga. Ini mudah dilakukan, tapi ada satu hal lagi - untuk setiap produk ‹> penetapan daftar harga Saya dapat memiliki banyak harga berdasarkan kuantitas, jadi seperti:

productID: 1010
priceListId: 1

min quantity: 1 -> price 10.00
min quantity: 5 -> price 9.50
min quantity: 10 -> price 9.00

productID: 1010
priceListId: 2

min quantity: 1 -> price 15.00
min quantity: 40 -> price 14.00
min quantity: 90 -> price 12.00

Saya rasa saya tahu cara membuat tabel pivot khusus meskipun saya tidak tahu cara menggunakannya. Saya mengikuti tautan ini sekarang saya tidak yakin apakah kode saya benar dan cara menggunakannya.

Saat ini saya memiliki:

Model produk:

class Product extends Model {

    public function pricelists()
    {
        return $this->belongsToMany('PriceList');
    }

    public function newPivot(Model $parent, array $attributes, $table, $exists)
    {
        if ($parent instanceof PriceList)
        {
            return new ProductPricePivot($parent, $attributes, $table, $exists);
        }

        return parent::newPivot($parent, $attributes, $table, $exists);
    }

}

Model Daftar Harga:

class PriceList extends Model {

    public function products()
    {
        return $this->belongsToMany('Product');
    }

    public function newPivot(Model $parent, array $attributes, $table, $exists)
    {
        if ($parent instanceof Product)
        {
            return new ProductPricePivot($parent, $attributes, $table, $exists);
        }

        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

Poros:

class ProductPricePivot extends Pivot {

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

    public function pricelist()
    {
        return $this->belongsTo('PriceList');
    }

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

}

Sekarang ProductPrice memperluas Model lagi dan hanya model standar tanpa metode tambahan apa pun.

Apakah ini benar? Jika ya, ikuti contoh di atas, bagaimana cara menambahkan kuantitas/tingkat harga baru ke daftar harga 1 pada produk 1010?

Saat ini, saat menjalin hubungan, saya melakukan:

$productID = 1010;
$priceListID = 1;

$priceList = PriceList::find($priceListID);
$priceList->products()->attach($productID);

$productToPriceList = $priceList->products()->find($productID);

Dan saya tersesat di sini... Saya menemukan hubungan ini, tetapi bagaimana saya sekarang dapat melampirkan tingkat harga kuantitas ‹> berikutnya ke dalamnya?

Bisakah seseorang memberikan contoh bagaimana menggunakan hubungan atau tautan tersebut ke halaman di mana saya dapat menemukan lebih banyak tentangnya? Dan ya, saya memeriksa dokumentasi Laravel, dan ya, saya juga mencarinya di Google.

Terima kasih!


person Raff W    schedule 19.03.2015    source sumber


Jawaban (1)


Saat Anda menjelaskan kasusnya, di sini saya melihat dua jenis hubungan:

  1. Hubungan Banyak ke Banyak antara Product & PriceList
  2. Hubungan Banyak-ke-Satu antara PriceList & ProductPrice (yang memiliki nilai "kuantitas minimum" dan "harga").

Saya berasumsi Anda tidak memerlukan kondisi harga yang sama untuk banyak "daftar harga". Setiap daftar akan memiliki ketentuan harganya.

Hubungan banyak-ke-satu tidak memerlukan tabel pivot.

Ikuti tautan ini, Anda akan menemukan bahwa sistem laravel Eloquent sangat membantu Anda.

Anda memerlukan 4 tabel: produk, daftar_harga, harga_produk, daftar_produk_ke_harga (poros)

tabel produk_ke_harga terlihat seperti itu:

*====*============*===============*
| id | product_id | price_list_id |
*====*============*===============*

Sekarang modelnya:

Produk:

class Product extends Eloquent {

    protected $table = 'products';

    public function price_lists()
    {
        return $this->belongsToMany('PriceList', 'products_to_pricelists', 'price_list_id');
    }

}

Daftar Harga:

class PriceList extends Eloquent {

    protected $table = 'price_lists';

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

}

Harga:

class ProductPrice extends Eloquent {

    protected $table = 'product_prices';

}

Sekarang mudah:

$productID = 1010;
$list_id = 1;
$theProduct = Product::find( $productID );
$theProductPriceLists = $theProduct->price_lists; // Don't use parens
$theList = Product::find( $productID )->price_lists()->where('price_lists.id', $list_id)->first(); // Here you use parens
$theListPrices = $theList->prices; // Again no parens

Laravel hanya mengelola koneksi pivot untuk Anda!

Semoga itu bisa membantu

person Nati Mask    schedule 19.03.2015
comment
Hai, terima kasih atas idenya! Saya akhirnya melakukan: $product = Product::find($productID); $product->pricelists()->attach($priceListID); $prodToPriceList = $product->pricelists()->find($priceListID); $prodToPriceList->prices()->create([... quantity and price array ...]); - person Raff W; 19.03.2015