Eloquent ORM中的关系查询

时间:2016-11-03 09:09:14

标签: laravel eloquent

我对Laravel很新,而且在理解Eloquent中的查询时遇到了问题。我有两个型号 - 笔记本电脑和位置。假设我想查询属于某个位置的所有笔记本电脑,这些笔记本电脑都有一个' stock'值为1.在SQL中,这将是一个左连接,但我如何在Eloquent中执行此操作?我已经将关系添加到两个模型中,因此笔记本电脑型号具有“位置”和“#39;方法,但我从哪里去?

2 个答案:

答案 0 :(得分:1)

您可以使用查询范围。它们在Laravel documentation

中有详尽的记录

在笔记本电脑型号中,您可以编写一个库存检查范围:

public function scopeInStock($query)
{
    return $query->where('stock', 1);
}

为了保持清洁,您可以在位置模型中创建另一个关系:

public function laptopsInStock()
{
   return $this->hasMany('Laptop')->inStock();
   // or this way:
   // return $this->laptops()->inStock();
}

现在要检索结果,有几个选项:

//all laptops
$location->laptops;

// in stock only
$location->laptopsInStock;

// eager loading
$location->with('laptopsInStock')->get();

答案 1 :(得分:1)

由于您没有提供任何代码,因此我将从基本代码中进行描述。

<强>迁移

地点表

<div class="row">
    <div class="col-sm-4">
        <div class="form-group field-user-user_dob has-success">
            <label class="control" for="user-user_dob">Date of Birth</label>
            <input type="text" id="datepicker" class="form-control" name="datepicker" readonly size="12">
            <div class="help-block"></div>
        </div>
    </div>
</div>

笔记本电脑桌

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

<强>模型

位置模型

Schema::create('laptops', function(Blueprint $table){
    $table->increments('id');
    $table->string('name');
    $table->integer('location_id')->unsigned();
    $table->integer('stock');
    $table->timestamps();

    $table->foreign('location_id')
          ->references('id')
          ->on('locations')
          ->onDelete('cascade')
          ->onUpdate('cascade');
});

笔记本电脑型号

class Location extends Model {
    public function laptops(){
        return $this->hasMany('\App\Laptop');
    }
}

如果您已经创建了这样的应用程序,那么有几种方法可以实现目标 这将查询属于某个位置并且库存值为class Laptop extends Model { public function location(){ return $this->belongsTo('\App\Location'); } } 的所有笔记本电脑。

1

1

2

Laptop::where('location_id','some_location_id')->where('stock',1)->get();

我希望这能解决你的问题。随意发表评论,并提出任何问题。