雄辩地多次发送相同的查询吗?
$author = $book->author;
$author = $book->author;
还是会缓存结果本身?如果是,要多长时间?
答案 0 :(得分:1)
Laravel每个类实例的每个请求加载一次关系。如果要重新加载-写Application.Terminate()
。保存到模型关系。了解更多https://laravel.com/docs/5.6/eloquent-relationships#eager-loading
答案 1 :(得分:0)
当您使用Eloquent加载关系时,它将把它缓存到名为relations
的属性中。
因此,如果您执行以下操作:
$author = $book->author;
然后用$book
查看dd($book);
变量,您将看到类似这样的内容:
Book {#312 ▼
#appends: array:2 [▶]
#fillable: array:7 [▶]
#hidden: array:6 [▶]
#with: array:2 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:11 [▶]
#original: array:11 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#dispatchesEvents: []
#observables: []
#relations: array:1 [▼
"author" => Author {#441 ▼
#appends: array:1 [▶]
#fillable: array:9 [▶]
#hidden: array:4 [▶]
#with: array:2 [▶]
#withCount: array:1 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:13 [▶]
#original: array:13 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#dispatchesEvents: []
#observables: []
#relations: array:2 [▶]
#touches: []
+timestamps: true
#visible: []
#guarded: array:1 [▶]
}
]
#touches: []
+timestamps: true
#visible: []
#guarded: array:1 [▶]
}
如果您想重新加载关系,则必须使用新鲜方法:
$author = $book->fresh()->author;
答案 2 :(得分:0)
当您访问没有括号的关系时,Laravel首先将从数据库中加载关系的数据,然后将结果存储在名为relations
的内部属性中。以后每次访问该关系时(同样不带括号),Laravel将从那里读取数据。
$book->author; // First time will trigger a query
$book->author; // Second and every subsequent access will load from relations property
这仅持续到请求/响应生命周期,实际上并没有将其缓存在任何类型的外部存储中以使其在请求之间持久存在,但是您可以自己使用Laravel的缓存机制来做到这一点。
如果要使用括号( )来访问关系,则不是这种情况,Laravel将向您返回查询构建器对象,您可以使用该对象进一步构建查询。这不会以任何方式缓存。
$book->author()->where(...)->first();
看看Laravel的Illuminate\Database\Eloquent\Concerns\HasAttributes::getRelationValue()
方法,该方法在您尝试将其作为属性访问时处理加载关系。