优化Laravel的Eloquent模型

arn*_*ins 5 php mysql laravel eloquent

数据库中有3个MySQL表:

产品介绍:

id | name
Run Code Online (Sandbox Code Playgroud)

产品价格:

product_id | currency_id | price
Run Code Online (Sandbox Code Playgroud)

货币:

id | mark
Run Code Online (Sandbox Code Playgroud)

Laravel的Eloquent模型看起来像这样:

// Product.php
class Product extends Eloquent {

    protected $table = 'products';
    protected $primaryKey = 'id';

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

}

// ProductPrice.php
class ProductPrice extends Eloquent {

    protected $table = 'product_prices';

    public function currency(){
        return $this->hasOne('Currency', 'id', 'currency_id');
    }

}

// Currency.php
class Currency extends Eloquent {

    protected $table = 'currencies';
    protected $primaryKey = 'id';

}
Run Code Online (Sandbox Code Playgroud)

现在我需要以所有价格展示所有产品!我的代码看起来像这样:

$products = Product::with('prices')->get();

foreach($products as $product){

    echo $product->name .'<br/>';

    foreach($product->prices as $price){
        echo $price->price .' '. $price->currency->mark .'<br/>';
    }

    echo '<hr/>';

}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但SQL查询太多(对于每个产品,它执行的查询数量与表中存储的许多货币一样多).那么,有没有什么方法可以在不使用Query Builder的情况下优化这些模型?

谢谢!

The*_*pha 8

您可以尝试这样来减少查询:

$products = Product::with('prices.currency')->get();
Run Code Online (Sandbox Code Playgroud)

这将急切加载嵌套关系,因此每次访问$price->currency->mark它时都不会查询相关模型.