Laravel 中的 Ajax 请求返回一个空对象

Posted

技术标签:

【中文标题】Laravel 中的 Ajax 请求返回一个空对象【英文标题】:Ajax request in Laravel returns an empty object 【发布时间】:2015-07-22 17:59:01 【问题描述】:

我使用Laravel & jQueryinsert 数据写入mysql 表并取回新行的新ID。问题是我得到一个空对象作为响应。我也试过print_r我的控制器中的结果,但我得到了一个巨大的数组。

这是一些代码。

jQuery :

        $.ajax(
            url: "locations/new",
            type: "get", //send it through get method
            data:name:name,description:description,
            success: function(response) 
              $data = $(response);
              console.log($data);                 
            ,
            error: function() 
              console.log("Unable add")
            
        ); 

控制器:

$name= Input::has('name') ? Input::get('name') : null;
        $description= Input::has('description') ? Input::get('description') : null;

        $add = Location::add($name, $description);

        return  $add;

和我的模特:

    public static function add($name,$description)

       $location_id = DB::table('locations')->insertGetId(
        array('name' => $name, 'description' => $description)
        );
        Self::get($location_id);      
    

    public static function get($location_id)
        $result = DB::table('locations')->where('location_id',$location_id)
                  ->select(DB::raw('location_id,name'));

        $result->get();

        return $result;

    

我知道我在这里可能有一个错误。请除了你的答案,我想知道错误的原因。

提前谢谢..

【问题讨论】:

试试console.log(response);看看会发生什么 我得到(一个空字符串) 只是扔在空中,也许我错了,但不应该是return Self::get($location_id);吗? @OfirBaruch 我试过了,我得到“无法转换为字符串”错误 这很奇怪。让我们尝试破解此代码以对其进行调试。撤消我的建议并在return $result 之前添加var_dump($result)。输出是什么? 【参考方案1】:

在共同调查 (@chat) 之后,问题似乎出在查询构建器中。

添加var_dump($result) 后,输出为:

Error: Syntax error, unrecognized expression: object(Illuminate\Database\Query\Builder)#248 (27)  ["connection":prot

我建议删除 DB::raw 函数,因为您可以将字段传递给 select 函数,并且出于方便的原因将 ->get() 函数附加到同一行。所以最终的查询构建器代码将是:

$result = DB::table('locations')->where('location_id',$location_id)->select('location_id',‌​'name')->get();

这解决了问题。

更新 - 原因

在深入研究了框架的源代码后,我发现:

/**
 * Set the columns to be selected.
 *
 * @param  array  $columns
 * @return $this
 */
public function select($columns = array('*'))

    $this->columns = is_array($columns) ? $columns : func_get_args();
    return $this;

所以select 函数需要一个数组或参数为columns,而当db::raw 正在使用时,它返回的字符串与select 函数的预期参数冲突。

【讨论】:

它可能有效,但您正在重新发明***。请查看我的答案,看看它是否有效。它更干净,并且是“laravel 方式”完成的。【参考方案2】:

你的控制器应该是这样的

$location = new Location();
$location->name = Input::get('name', null);
$location->description= Input::get('description', null);
$location->save();
return response()->json(location);

【讨论】:

只有当我更改为 return $location; 时它才有效但是我怎样才能获得新行的插入 id? 我犯了一个错误。 return response()->json($location); 也应该很好用,你可能会期待不同的输出。无论如何,我认为这更清晰,更容易理解。 Laravel 很漂亮,应该使用原生方法。根据您的模型和可填充属性的外观,它甚至可以进一步优化。阅读文档。它是你的朋友!

以上是关于Laravel 中的 Ajax 请求返回一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:为啥我的 ajax 请求返回“500(内部服务器错误)”?

如何在laravel 5.2中控制多个ajax请求

Laravel 5.7 Ajax 发布请求返回 419 状态码

ajax返回一个空请求(未定义的索引)[重复]

使用Laravel 5.4请求Ajax

Laravel 使用 ajax 请求在同一张桌子上返回父母的孩子?