1

index メソッドを持つ ArticleCommentsController があります

class ArticleCommentsController extends BaseController
{
    public function index($id)
    {

        $comments = DB::table('comments')
            ->leftJoin('users', 'users.id', '=', 'comments.user_id')
            ->where('comments.article_id', '=', $id)
            ->get();

         return $this->response->item($comments, new CommentTransformer);
    }
}

これはトランスクラスです

namespace App\Transformers;

use League\Fractal\TransformerAbstract;

class CommentTransformer extends TransformerAbstract{
    public function transform($comment)
    {
        return $comment; //simplified
    }
}

応答は次のエラーです。

get_class() expects parameter 1 to be object, array given.

明らかに、Fractal\transform を呼び出すときにコメント オブジェクトのインスタンスを送信する必要がありますが、laravel の生のクエリは配列または QueryBuilder クラスのインスタンスのみを返すため、その方法がわかりません。

4

3 に答える 3

2

悲しいことにitem、オブジェクトのメソッドにはresponse、配列ではなくオブジェクトが必要なようです。メソッドを使用してarrayも機能しますが、渡したトランスフォーマーは使用されません。

したがって、次のように を使用して回避できると思いますArrayObject

return $this->response->item(new ArrayObject($comments), new CommentTransformer);

use ArrayObject;ファイルの先頭にa を付けることを忘れないでください。

于 2016-01-23T16:56:19.817 に答える
1

次の手順を実行すると、うまくいきます。

1.変更

return $this->response->item($comments, new CommentTransformer);

return $this->response->collection(Collection::make($comments), new CommentTransformer);

2.トランスフォーマークラス

namespace App\Transformers;
use League\Fractal\TransformerAbstract;

class CommentTransformer extends TransformerAbstract{
     public function transform($comment)
     {
         return [
            'id' => $comment->id,
            ...
         ];
     }
}
于 2017-05-05T06:54:56.493 に答える