将自定义集合添加到 Laravel 查询生成器中的 eloquent

Adding custom collection to the eloquent within Laravel Query Builder

我有一个查询,我想使用 Laravel 查询生成器添加一个集合。

Hotel::addSelect([
   'selectableLocations' => AllLocations::orderBy('name')->get()
])
  ->with('location')
  ->get();

嗯,这个returns:

SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters (SQL: select [{"id":1,"name":"John Avenue"},{"id":4,"name":"Ontirio Village"},{"id":2,"name":"Rovie"},{"id":3,"name":"Movie Lot"}] from dogs limit 100 offset 0)

我知道这可能看起来像是一种反模式,但我需要它的原因是因为我有一个数据表并且想显示一个带有 AllLocations 的 select(下拉列表),以便用户可以在数据表中进行更改.

我的想法是我可以 $dog->selectableLocations 查看所有位置。因为如果我不这样做,它会单独查询每一行。

有办法吗?


要是能做到这样就完美了

$selectableLocations = AllLocations::get();

$hotels = Hotel::addSelect([
    'selectableLocations' => $selectableLocations
])
  ->with('location')
  ->get();

编辑:

Because if I don't do it like this, it will query for each row individually.

由于您主要关心的是多个查询,如果您实施某种缓存,则可以避免数据库调用。为什么不将列表作为自定义属性包括在内,从缓存中加载集合?像这样:

public function getAllLocationsAttribute()
{
    return Cache::remember('all_locations', 30, function(){ //add remove seconds as required
        return AllLocatiobs::get();
    });
}

合并这两个集合怎么样?

$hotels = Hotel::get();
$selectableLocations = AllLocations::get();
$hotels->put('selectableLocations', $selectableLocations);

现在,$hotels->selectableLocations 将是 AllLocations 的集合。