【问题标题】:Laravel 4. Return database table as JSONLaravel 4. 以 JSON 格式返回数据库表
【发布时间】:2014-09-04 21:20:37
【问题描述】:

我对 Laravel 真的很陌生。我已经设法通过迁移功能设置了一个数据库,现在我想从数据库中返回一个表作为 json。我正在做的事情有点像rest-api-thingy。没什么太花哨的。

在我的路由器中,我有一条通往/api/cases 的路由,它为这些案例初始化控制器。从那个控制器,我基本上只想从我的数据库中返回一个表作为 JSON。

路由器:

Route::resource('/api/cases', 'CasesController');

控制器:

class CasesController extends \BaseController {

    public function index()
    {
        //return db table as json here
    }
}

型号:

class Case extends \Eloquent {
    protected $fillable = [];
}

我的数据库是这样的:

我只有一张表,名为“cases”。那个具有“id”、“name”、“title”等属性。 我现在如何以 json 的形式返回该 rest-like?

【问题讨论】:

标签: php rest laravel-4


【解决方案1】:

您可以简单地调用toJSON() 方法:

Case::all()->toJson();

【讨论】:

  • 然后我收到此错误“哎呀,好像出了点问题。”。
  • 将调试模式设置为 true,这样您就可以看到完整的错误。 app/config/app.php
  • 谢谢!这样做了,现在我在 CasesController.php 中收到“语法错误,意外的 'Case' (T_CASE)”。
  • case 是 php 中的保留字,这意味着您将不得不使用其他东西。 Check the docs on Switch case
  • 哦,谢谢!确实如此。我一般都是做js的(没有规则的地方)。
【解决方案2】:

我假设您的 Case 模型已经过测试并且工作正常。完成后,您可以查询此表中的所有对象,将结果转换为数组,并将其编码为 JSON。

public function index()
{
    return Response::json(Case::all()->toArray());
}

【讨论】:

  • 当我这样做时,我得到“哎呀,好像出了点问题。”至尊基本上什么也没说。如何测试模型是否正常工作?我猜它确实是因为 php artisan 命令生成了它。
  • 检查您的日志文件 (/app/storage/logs) 或在 /app/config/app.php 中启用调试以查看详细的糟糕屏幕。
  • 谢谢!这样做了,我在 CaseController 中得到了“语法错误,意外的 'Case' (T_CASE)'”。
【解决方案3】:

我认为 ORM 的工作不是担心表示逻辑,这就是 JSON。您将需要将数据转换为各种类型以及隐藏事物,有时还需要创建一个缓冲区来安全地重命名事物。

您可以使用 Fractal 完成所有这些操作,我正是出于这个原因而构建的。

<?php namespace App\Transformer;

use Acme\Model\Book;
use League\Fractal\TransformerAbstract;

class BookTransformer extends TransformerAbstract
{
    /**
     * List of resources possible to include
     *
     * @var array
     */
    protected $availableIncludes = [
        'author'
    ];

    /**
     * Turn this item object into a generic array
     *
     * @return array
     */
    public function transform(Book $book)
    {
        return [
            'id'    => (int) $book->id,
            'title' => $book->title,
            'year'    => (int) $book->yr,
            'links'   => [
                [
                    'rel' => 'self',
                    'uri' => '/books/'.$book->id,
                ]
            ],
        ];
    }

    /**
     * Include Author
     *
     * @return League\Fractal\ItemResource
     */
    public function includeAuthor(Book $book)
    {
        $author = $book->author;

        return $this->item($author, new AuthorTransformer);
    }
}

嵌入(包括)内容可能比您现在需要的多一点,但它也可以非常方便。

我经常谈论 API 以及尝试直接公开数据库模式的危险。除非您的应用位于内部网络上,并且只有您的应用会查看这些数据,并且您的应用永远不会改变,否则直接与表交互是一个非常糟糕的主意。

这里是my talk,多次以Laravel为例。

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 2011-06-11
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多