Используйте необработанные запросы Laravel с Dingo / APi + Fractal / трансформеры с Laravel 5.1

У меня есть 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.

1

Решение

К сожалению, item метод на response объект, кажется, требует и объект, а не массив. С использованием array Метод сработает, но не будет использовать любой передаваемый вами трансформатор.

Итак, я думаю, что вы могли бы уйти с помощью ArrayObject, следующим образом:

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

Не забудьте поставить use ArrayObject; в верхней части файла.

2

Другие решения

это было очень давно, но я напишу ответы для этого парня или других или меня в будущем, если я потеряю память, хахаха

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->collection(Collection::make($comments), new CommentTransformer);

}
}

конечно, вам нужно добавить это в контроллер ArticleCommentsController

// Dingo
use Dingo\Api\Routing\Helpers;

//Convert query to collective
use Illuminate\Support\Collection;

//Transformers for API
use App\Transformers\CommentTransformer;

и это внутри вашего контроллера перед вашими функциями

//Use for Dingo Helpers
use Helpers;

Все вместе:

<?php

namespace App\Http\Controllers;
use Response;
use App\User;
use App\Http\Requests;
use Illuminate\Http\Request;

// Dingo
use Dingo\Api\Routing\Helpers;

//Convert query from LMS lbrary to collective
use Illuminate\Support\Collection;

//Transformers for API
use App\Transformers\CommentTransformer;

class ArticleCommentsController extends BaseController
{

//Use for Dingo Helpers
use Helpers;

public function index($id)
{

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

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

}
}

С уважением !, Я надеюсь, что это поможет другим в будущем: D

1

Проделайте следующие шаги, все получится:

1.Change

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,
...
];
}
}
1
По вопросам рекламы [email protected]