我们假设我们有相应模型的表select items, id,
case when t1.items = 'a' or t1.items = 'b' the t2.order
else 3
end as order
from t1
left join t2 on t1.items = t2.items;
和dog
:
breed
和
class Dog extends Model {
protected $table = 'dogs';
protected $fillable = [
'name', 'breed_id'
];
protected $hidden = [ 'breed_id' ];
public function breed() {
return $this->belongsTo(Breed::class, 'breed_id');
}
}
我们可以像这样急切地加载和访问该品种:
class Breed extends Model {
protected $table = 'breeds';
protected $fillable = [
'name'
];
}
如果我们有一个API函数返回这个狗集合,默认情况下它会将它们格式化为JSON,并且每个狗对象都会有一个'品种'对象:
$dogs = Dog::with('breed')->all();
现在让我们说我们需要使用原始查询来加载狗(这是一个简单的例子,请假装那里有一个很好的理由我们正在使用原始查询)。我们可以使用JOIN来获取品种名称:
{"dogs":[
{
"id": 1,
"name": "Rover",
"breed": {
"id": 1,
"name": "Golden Retriever"
}
}
//etc
但是,如果我们将其作为JSON返回,它将具有不同的结构:
$query = "SELECT dogs.*, breeds.name AS breed_name
FROM dogs
JOIN breeds ON dogs.breed_id = breeds.id";
$dogs = DB::select(DB::raw($query));
有没有办法让我们的原始查询结果与我们的Eloquent模型结果具有相同的格式而不必这样做?
{"dogs":[
{
"id": 1,
"name": "Rover",
"breed_id": 1,
"breed_name": "Golden Retriever"
}
我在问,因为我不希望客户端应用程序必须以两种不同的方式解析结果,具体取决于特定的API函数是使用Eloquent进行预先加载还是使用原始查询。
答案 0 :(得分:1)
即使对具有非常好的JSON支持的数据库,准确地返回你想要的也不是那么可行。
AFAIK MySQL不支持数组,但在Postgres中你可以选择数组中的品种信息,但即使这样你也无法键入数组的元素。
您可以选择所有内容作为JSON:
-- Postgres Example
SELECT row_to_json(row(dogs.*, ARRAY[breeds.name, breeds.id])) FROM ...
但同样,键入值比在代码而不是SQL中实现所需功能更省力。