我正在学习Laravel,并且正在创建一个简单的应用程序。在该应用程序中,我想查询对象,具体取决于视图中select元素的值。我想出了这个JS代码:
$('#carClass').change(function(){
var classID = $('#carClass option:selected').val();
var gameID = $('#gameID').val();
axios.post('/getcars', {
game_id: gameID,
carClassID: classID
}).then((r)=>{
var cars = r.data.carsQuery;
console.log(cars);
console.log(cars.lenght);
for(var i=0; i<cars.length; i++){
$('#chooseCar').append('<option>' + cars[i].car + '</option>');
}
});
});
在控制器中,我创建了此功能:
class CarController extends Controller
{
public function getCars(Request $request)
{
$query = Game::find($request->game_id)->cars->where('car_class_id', $request->carClassID)->sortBy('id');
return Response([
'carsQuery' => $query->toArray()
]);
}
}
问题是我得到此函数的一个结果为数组,而另一个结果为对象。屁股有点痛苦,因为我无法在JS中为此显示对象。无论如何,要使两个结果都处于同一类型?为什么会这样?
答案 0 :(得分:1)
好的,我发现发生了什么事。在一种情况下,Query返回了一个结果,因此将其作为数组返回。如果有多个结果,则将其作为对象返回。谢谢大家的回答!
答案 1 :(得分:0)
我没有在模型中定义汽车关系的方式,因此您可以从数组中选择第一个索引对象。
var A: TJSONValue;
A := TJSONObject.ParseJSONValue(Memo1.Text);
if A <> nil then
try
Memo2.Text := A.ToString;
finally
A.Free;
end;
但是正确的方法是使用class CarController extends Controller
{
public function getCars(Request $request)
{
$query = Game::where($request->game_id)->cars->where('car_class_id', $request->carClassID)->sortBy('id');
$data = $query->toArray();
return Response([
'carsQuery' => $data[0]
]);
}
}
汽车关系和eager load
方法
first()
答案 2 :(得分:0)
我发现您在查询中缺少->get()
呼叫。
您所拥有的:
$query = Game::where($request->game_id)
->cars->where('car_class_id', $request->carClassID)
->sortBy('id');
应该如何:
$query = Game::where($request->game_id)
->cars->where('car_class_id', $request->carClassID)
->sortBy('id')
->first(); // THIS is the missing call, this will return the result of your query
如果要获得单个结果,则应添加->first()
。如果查询必须返回多个行,请添加->get()
。
请注意不同的结果:如果使用->first()
,它将返回一个模型(对象),但是如果使用->get()
,则结果将是一个集合。这可能就是为什么您的结果不一致的原因。如果您希望它们全部都是数组,则可以使用->get()
方法,以便即使只有一个结果,它也总是返回一个集合