【问题标题】:Laravel - Fractal - Using Find() in transformer file- is it correct or can it be done more efficiently?Laravel - 分形 - 在转换器文件中使用 Find() - 是正确的还是可以更有效地完成?
【发布时间】:2015-08-20 02:11:57
【问题描述】:

所以,我正在使用 Laravel 5 和 Fractal 为我的数据输出添加表示和转换层,我想知道我在下面做的事情是正确的还是矫枉过正。

我有用户表和收藏夹表,我希望我的 JSON 输出如下:

注意:密切注意嵌套数据中的profile_id和id。我基本上想要我的收藏夹以及我收藏的用户详细信息(来自用户表)。

下面,我收藏了 profile_id 404,他的详细信息(来自用户表)也嵌套了。

"data": [
    {
        "id": 15,
        "user_id": 231,
        "profile_id": 404, <------------------------ HERE
        "created_date": "2013-04-10 21:35:28",
        "user": {
            "data": {
                "id": 404, <------------------------ HERE
                "username": "hugeheart12",
                "has_photo": 1
            }
        }
    },
    {
        "id": 64,
        "user_id": 231,
        "profile_id": 1085, <------------------------ HERE
        "created_date": "2013-06-17 08:14:02",
        "user": {
            "data": {
                "id": 1085, <------------------------ HERE
                "username": "snowbird37",
                "has_photo": 1
            }
        }
    }

用户
身份证 (PK)
名称
用户名
电子邮件
创建日期

收藏夹
身份证
用户ID
profile_id
创建日期

用户模型

<?php namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Support\Facades\DB;


class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

use Authenticatable, CanResetPassword;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'users';

public function favourites()
{
    return $this->hasMany('App\Favourites', 'profile_id', 'id');
}

public function photos()
{
    return $this->hasMany('App\Photos', 'user_id', 'id');
}

最喜欢的模特

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Favourites extends Model {

    protected $table = 'favourite';

    public function user()
    {
        return $this->belongsTo('App\User', 'from', 'id');
    }
}

这就是我的控制器中的内容:

$favourites = Favourites::with('user')->where('profile_id', '=', 231)->get();  

$resource = new Fractal\Resource\Collection($favourites , new FavouriteTransformer());

return $this->respond(
    $this->fractal->createData($resource)->toArray()
);

FavoriteTransformer

<?php
namespace App\Mmh\Transformer;

use App\Favourites;
use League\Fractal;


class FavouriteTransformer  extends Fractal\TransformerAbstract
{

protected $defaultIncludes = [
    'user'
];


public function transform(Favourites $favourites)
{
    return [
        'id'           => (int)$favourites->id,
        'user_id'         => (int)$favourites->user_id,
        'profile_id'           => (int)$favourites->profile_id,
        'created_date' => $favourites->created_date,
    ];
}

public function includeUser( Favourites $favourites )
{        
    return $this->item( 
        $favourites->user->find($favourites->profile_id), new UserTransformer 
    );
}

}

查看最后返回 return $this->item( $favourites->user->find($favourites->profile_id), new UserTransformer );

上面的所有代码都给了我上面的 JSON,但是有没有更好的方法或者我这样做的方式是正确的?有些事情告诉我,必须有比为每个项目查询数据库更好的方法,但我不知道如何。

感谢您的阅读。

【问题讨论】:

    标签: php api laravel laravel-5


    【解决方案1】:

    您已经在controller 中急切加载user,所以我认为您不需要在FavouriteTransformer 中再次为每个favourites 调用user。 您可以简单地使用它来包含user

    return $this->item( 
            $favourites->user, new UserTransformer 
        );
    

    Fractal 会看到,user 已经存在,所以它不会调用 db 查询来抓取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-26
      • 2019-07-08
      • 2010-11-26
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多