请问 transformer 多级嵌套,select *怎么处理?或者能控制关联的 transformer 的字段

include=topic.user
file
file

比如 topic只要几个字段,user也只要几个字段。
不是要避免select * 吗?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
liyu001989
最佳答案

预加载是自动的,相当于 load('user'),你可以把 dingo 的预加载关闭了,自己手动 load 的时候增加 select。

找个地方关闭,或者全局关闭

file

5年前 评论
讨论数量: 3
liyu001989

预加载是自动的,相当于 load('user'),你可以把 dingo 的预加载关闭了,自己手动 load 的时候增加 select。

找个地方关闭,或者全局关闭

file

5年前 评论

@liyu001989
这个是订单控制器

<?php

namespace App\Http\Controllers\Api;

use App\Transformers\OrderTransformer;
use Dingo\Api\Transformer\Factory;
use Illuminate\Http\Request;

class OrdersController extends Controller
{
    /**
     * 订单列表
     *
     * @param Request $request
     * @return \Dingo\Api\Http\Response
     * 全部 all
     * 待付款 wait_pay
     * 待发货 wait_delivery
     * 待收货 wait_received
     * 已收货 received
     * 退货退款 refund
     * 交易完成 completed
     * 交易关闭 closed
     */
    public function index(Request $request,Factory $factory)
    {
        $factory->disableEagerLoading();
        $type   = $request->input('type', 'all');
        $orders = $this->user()->orders()->with(['shop'=>function($query){
            $query->select(['id','created_at','updated_at']);
        }]);
        $result = $orders->when($type == 'wait_pay', function ($query) {
            return $query->waitPay();// 待付款
        })->when($type == 'wait_delivery', function ($query) {
            return $query->waitDelivery();// 待发货
        })->when($type == 'wait_received', function ($query) {
            return $query->waitReceived();// 待收货
        })->when($type == 'received', function ($query) {
            return $query->received();// 已收货
        })->when($type == 'completed', function ($query) {
            return $query->completed();// 交易完成
        })->when($type == 'closed', function ($query) {
            return $query->closed();// 交易关闭
        })->paginate();

        return $this->response->paginator($result, new OrderTransformer());
    }
}

这是订单transformer

<?php

namespace App\Transformers;

use App\Models\Order;
use League\Fractal\TransformerAbstract;

class OrderTransformer extends TransformerAbstract
{
    protected $availableIncludes = ['items', 'shop'];

    public function transform(Order $order)
    {
        return [
            'id'             => $order->id,
            'order_status'   => $order->order_status,
            'created_at'     => $order->created_at->toDateTimeString(),
            'address'        => $order->address,
            'total_amount'   => $order->total_amount,
            'remark'         => $order->remark,
            'no'             => $order->no,
            'paid_at'        => $order->paid_at ? $order->paid_at->toDateTimeString() : $order->paid_at,
            'payment_method' => $order->payment_method,
            'payment_no'     => $order->payment_no,
            'closed'         => $order->closed,
            'reviewed'       => $order->reviewed,
            'ship_status'    => $order->ship_status,
            'ship_data'      => $order->ship_data,
        ];
    }

    public function includeItems(Order $order)
    {
        return $this->collection($order->items, new OrderItemTransformer());
    }

    public function includeShop(Order $order)
    {
        return $this->item($order->shop, new ShopTransformer());
    }
}

这个是店铺transformer

<?php

namespace App\Transformers;

use App\Models\Shop;
use League\Fractal\TransformerAbstract;

class ShopTransformer extends TransformerAbstract
{
    public function transform(Shop $shop)
    {
        return [
            'id'            => $shop->id,
            'shop_name'     => $shop->shop_name,
            'avatar'        => $shop->avatar,
            'address'       => $shop->full_address,
            'description'   => $shop->description,
            'describe_star' => $shop->describe_star,
            'service_star'  => $shop->service_star,
            'delivery_star' => $shop->delivery_star,
            'created_at' => $shop->created_at->toDateTimeString(),
            'updated_at' => $shop->updated_at->toDateTimeString(),
        ];
    }
}

问题1:
如果我在控制器中select指定店铺的部分字段,那么结果会返回null
file
那是不是意味着要在ShopTransformer传个type,比如order,来控制ShopTransformer transform的return。

    public function includeShop(Order $order)
    {
        return $this->item($order->shop, new ShopTransformer($type));
    }

问题2:
全局
$factory->disableEagerLoading();
在写在哪儿最好。

问题3:
你是怎么知道disableEagerLoading()这个方法的?
我看了这个但是没有找到fractal

5年前 评论
liyu001989
  1. transformer 的逻辑是你自己控制的,如果是null 就不显示,或者传个type控制,看你的设计。
  2. 中间件,或者provider。
  3. 这个是 dingo 控制的,在 dingo 里面
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!