Laravel返回查询作为对象而不是数组

时间:2020-10-29 17:03:24

标签: javascript php laravel

我正在学习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中为此显示对象。无论如何,要使两个结果都处于同一类型?为什么会这样?

3 个答案:

答案 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()方法,以便即使只有一个结果,它也总是返回一个集合