thinkphp使用with對關聯數據進行預加載


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查詢

使用預加載的時候,關聯的數據只進行了一次查詢:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM