如何正确使用hasOne关系?

时间:2019-07-02 22:53:17

标签: php laravel

我正在学习Laravel,并且正在尝试创建简单的在线商店。 我创建了表项目和金额。现在,我要显示所有具有库存量的项目,但是由于某种未知的原因,我无法将项目数量提取到项目中。

这些是我的表模式:
项目:


    Schema::create('items', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('category_id')->unsigned();
                $table->string('name', 120)->nullable(false);
                $table->float('price',8,2)->unsigned()->nullable(false);
                $table->longText('short_specification');
                $table->longText('specification');
                $table->longText('description');
                $table->string('photo', 100);
                $table->engine = 'InnoDB';

                $table->foreign('category_id')->references('id')->on('categories');
            });

金额:


    Schema::create('amounts', function (Blueprint $table) {
                $table->integer('item_id')->unsigned();
                $table->integer('amount')->unsigned()->nullable(false);
                $table->engine = 'InnoDB';
            });

            Schema::table('amounts',function($table){
                $table->foreign('item_id')->references('id')->on('items');
                $table->primary('item_id');
            });

这些是我的模特:
项目:


    class Item extends Model
    {
        public $timestamps = false;


        function amount()
        {
            return $this->hasOne('App\Amount','item_id','id');
        }
    }

金额:


    class Amount extends Model
    {

        function item()
        {
                 //$this->belongsTo('App\Item');
            return $this->belongsTo('App\Item','item_id','id');
        }
    }

当我这样做时:

$items = DB::table('items')->get();
dd($items);
return view('home')->with('items',$items);

项目正确显示,但项目数量不存在。 当我这样做时:


    @foreach($items as $item)

            {{ $item->id }}
            {{ $item->amount }}

    @endforeach

我知道了:

  

未定义属性:stdClass :: $ amount(视图:D:\ 2。   PROGRAMY \ xampp \ htdocs \ silicon_store \ resources \ views \ home.blade.php)   错误。


从我在网上看到的情况(我已经尝试修复了3个多小时,所以我必须做完全错误的事情),它应该可以正常工作,但是不能。

2 个答案:

答案 0 :(得分:1)

通过$items = DB::table('items')->get();,您正在使用查询构建器。除非您在查询中加入数量表,否则它将没有关系的值。

$items = DB::table('items')
        ->leftJoin('amounts', 'items.id', '=', 'amounts.item_id')
        ->get();

我认为您也可以使用口才查询。在这种情况下,每个$item都是Item模型的实例,而不是StdClass对象。

$items = App\Item::with('amount')->get();

答案 1 :(得分:0)

或者您可以使用这种查询类型

$items = App\Item::whereHas('amount')->get()

Here链接到了解whereHas