1、with('relation'),只預加載relation這個關聯,如下面
public function relation() { return $this->hasOne(Relation::class); }
2、with(['relation', 'relation.relation1']),預加載relation以及,和relation關聯的relation1
這種場景是Relation類中還定義了一個關聯relation1
class Relation { public function relation1() { return $this->hasOne(Relation1::class); } }
這樣一來,一個with就把當前模型的關聯relation以及relation的下級關聯relation1查詢出來了,
這對hasMany這種關聯特別有好處,如果hasMany這種不使用預加載的話,每訪問一次就會查詢一次,而不是一次把多條關聯數據查詢出來。
測試:
數據庫:兩個表,一個是relation表,只有id字段;另一個是relation1表,除了id之外,還有關聯relation表的relation_id。
控制器文件:
<?php namespace app\test\controller; use app\test\model\Relation; use think\Controller; class Test extends Controller { public function test(Relation $relationModel) { /** @var \app\test\model\Relation[] $relations */ $relations = $relationModel->select(); foreach ($relations as $relation) { /** @var \app\test\model\Relation $relation */ foreach ($relation->relation1 as $relation1) { /** @var \app\test\model\Relation1 $relation1 */ echo $relation1->id . PHP_EOL; } } } public function test1(Relation $relationModel) { /** @var \app\test\model\Relation[] $relations */ $relations = $relationModel->with('relation1')->select(); foreach ($relations as $relation) { /** @var \app\test\model\Relation $relation */ foreach ($relation->relation1 as $relation1) { /** @var \app\test\model\Relation1 $relation1 */ echo $relation1->id . PHP_EOL; } } } }
模型文件
Relation.php
<?php namespace app\test\model; /** * Class Relation * @package app\test\model * * @property Relation1[] relation1 */ class Relation extends BaseModel { public function relation1() { return $this->hasMany(Relation1::class); } }
Relation1.php
<?php namespace app\test\model; /** * Class Relation1 * @package app\test\model * * @property integer id */ class Relation1 extends BaseModel { }
結果:
不使用with預加載,每次循環都進行sql查詢
使用預加載的時候,關聯的數據只進行了一次查詢: