Laravel使用Eloquent访问外键的条款

时间:2017-06-05 12:34:09

标签: php laravel collections eloquent

我有两个名为Item and Sale的模型

class Item extends Model
{   
    public function sale()
    {
        return $this->hasMany('App\Sale', 'sale_id');
    }
}

class Sale extends Model
{
    public function item()
    {
        return $this->belongsTo('App\Sale', 'item_id');
    }
}

这是我的项目

的迁移文件
public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->increments('id');
            $table->string('code');
            $table->string('name');
            $table->string('location');
            $table->double('buy_price');
            $table->double('sell_price');
            $table->integer('quantity');
            $table->timestamps();
        });
    }

和销售

public function up()
    {
        Schema::create('sales', function (Blueprint $table) {
            $table->increments('id');
            $table->date('date');
            $table->integer('quantity');
            $table->double('sell_price');
            $table->double('subtotal');
            $table->integer('item_id')->unsigned();
            $table->timestamps();
        });

        Schema::table('sales', function (Blueprint $table) {
            $table->foreign('item_id')->references('id')->on('items')
                  ->onDelete('cascade')->onUpdate('cascade');
        });
    }

我记录了每日销售数据,以了解当天销售的商品数量。因此我想每天查看销售情况。这就是我在控制器中所做的。

class SaleController extends Controller
{
    public function show($date)
    {
        $sales = Sale::where('date', $date)->get();
        return view('sale.detail', compact('sales'));
    }
}

最后在我的刀片中,我这样做是为了调用项目的信息

@foreach($sales as $sale)
    <tr>
        <td>{{ $sale->item->code }}</td>
        <td>{{ $sale->item->name }}</td>
        <td>{{ $sale->sell_price }}</td>
        <td>{{ $sale->quantity }}</td>
    </tr>
@endforeach

最后我得到试图获取非对象的属性 有人可以告诉我我的代码有什么问题吗? 我在Laravel中相对较新,但我热衷于尝试不同的东西来看看这个框架可以做什么。

非常感谢

2 个答案:

答案 0 :(得分:2)

注意到你的关系定义错了。在App\Sale关系中将App\Item更改为item。猜猜一个轻微的滑倒。

class Sale extends Model
{
    public function item()
    {
        return $this->belongsTo('App\Item', 'item_id');
    }
}

答案 1 :(得分:1)

由于您需要多次访问item对象,更好的方法是将其加载为:

public function show($date)
{
    $sales = Sale::with('item')->where('date', $date)->get();
    return view('sale.detail', compact('sales'));
}

然后您可以保留原始刀片文件。