Laravel:如何定义这些Eloquent关系并将它们全部传递给一个视图?

时间:2016-07-12 10:13:32

标签: php laravel

我目前想拥有3个数据库表,因此需要这样的模型:

  • 库存
  • 产品
  • 库存中的产品X的数量

现在我有3个型号“Stock”,“StockProducts”和“StockProductsAmount”。 StockProductsAmount在StockProducts和StockProductsAMount的ID上有2个外键。

我如何定义关系?在App \ StockProductsAmount中我已经定义了这个:

class StockProductsAmount extends Model
{
    public function stock() {
        return $this->hasOne('App\Stock');
    }
    public function stockproduct() {
        return $this->hasOne('App\StockProducts');
    }
}

我是否还需要在其他任何地方定义hasMany - 关系?但在哪里?

另外,如何在一个视图中访问这3个表中的值?

这就是我现在所拥有的。注释掉的值是我在定义Eloquent关系后开始的。

public function stockOverview()
    {
        $products = StockProducts::all();
        $stocks = Stock::all();
        $amounts = StockProductsAmount::all();

        //$stock = StockProductsAmount::all()->with('stock')->with('stockproducts');

        $data = array(
            'stocks' => $stocks,
            'products' => $products,
            'amount' => $amounts
        );
        return view('stock.overview')->with($data);
    }

提前谢谢。

编辑:表格的结构:

股票:

Schema::create('stocks', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('color1');
            $table->string('color2');
            $table->timestamps();
});

库存_产品:

Schema::create('stock_products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });

库存产品金额:

Schema::create('stock_products_amounts', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('fk_stock')->unsigned();
            $table->foreign('fk_stock')->references('id')->on('stocks');
            $table->integer('fk_stockproduct')->unsigned();
            $table->foreign('fk_stockproduct')->references('id')->on('stock_products');
            $table->integer('amount');
            $table->timestamps();
        });

1 个答案:

答案 0 :(得分:0)

根据您的表格结构,它似乎是表格 - 股票 Stock_Products 与表有多对多关系 - Stock_Products_Amount 充当存储两个表的id值的数据透视表。

所以基于Laravel Many-to-Many

你的模特可以拥有像 -

这样的关系

股票模型 -

public function Products() {
        return $this->belongsToMany('App\Products', 'Stock_Products_Amount ', 'fk_stock', 'fk_stockproduct');
        //                  Product Model ^     name of pivot table ^ 
    }

产品型号 -

public function stocks() {
        return $this->belongsToMany('App\Stock', 'Stock_Products_Amount ', 'fk_stockproduct', 'fk_stock');
    }

现在您可以使用上面的功能一起检索所有值。

获取额外列的值使用withPivot()。例如。获取amount列的值将其用作 -

public function Products() {
            return $this->belongsToMany('App\Products', 'Stock_Products_Amount ', 'fk_stock', 'fk_stockproduct')->withPivot("amount");
            //                  Product Model ^     name of pivot table ^ 
        }

要一起查看视图中的内容,请定义一个函数,例如(getProducts)并获取此类视图的所有产品 -

股票模型 -

    public function Products() {
            return $this->belongsToMany('App\Products', 'Stock_Products_Amount ', 'fk_stock', 'fk_stockproduct')->withPivot("amount");
            //                  Product Model ^     name of pivot table ^ 
        }
    public function getProducts() {
            return $this->Products()->get();
            //             ^ this is defined above 
        }

现在在控制器中你只需要获得所有股票并将它们发送到视图 -

public function stockOverview()
    {
        $stocks = Stock::all();
        return view('stock.overview')->with($stocks);
    }

现在你可以看到这样的一切 -

<!-- list of all stocks --> 
@foreach($stocks as $stock)
{{$stock}}
    <!-- list of products for that stock -->
    @foreach($stock->getProduct() as $Product)
                  <!--  ^ this is the function we declared above in model -->
    {{$Product}}

    @endforeach
@endforeach

注意 - 检查正确的型号和属性名称,因为我刚刚给出了一个想法。也可以使用带有withPivot()的正确列。