0

在我的项目中,我使用 Dingo API 和 Fractal 转换器进行响应。

当我调用具有如下关系的站点资源列表 API 时:

GET http://localhost:8000/api/sites

如果我将关系放入$defaultIncludes[]变压器中,但如果我将这些关系放入$availableIncludes[]并像这样调用我的控制器,它会起作用:

GET http://localhost:8000/api/sites?include=city

我对数据库查询有一个错误:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'cities.site_id' in 'where clause' (SQL: select * from `cities` where `cities`.`site_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) and `cities`.`deleted_at` is null)"

请问我做错了什么?

谢谢你。

站点控制器.php

<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Models\Site;
use Dingo\Api\Contract\Http\Request;
use Dingo\Api\Http\Response;
use Dingo\Api\Routing\Helpers;
use App\Http\Transformers\SiteTransformer;
use Illuminate\Support\Facades\DB;

class SitesController extends Controller
{
    use Helpers;

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request) : Response
    {
        $page_size = 10;
        if ( $request->filled('pageSize')) {
            $page_size = $request->input('pageSize');
        } 

        $results = Site::query();

        if ( $request->filled('search')) {
            $q = $request->input('search');
            $results = $results->where('name', 'like', "%{$q}%")
                            ->orWhere('code', 'like', "%{$q}%");
        } 

        if ( $request->filled('sortBy') ) {
            if ( $request->input('orderBy') === 'ascend') { 
                $results = $results->orderBy($request->input('sortBy'), 'asc');
            } else if ( $request->input('orderBy') === 'descend') {
                $results = $results->orderBy($request->input('sortBy'), 'desc');
            }          
        }

        $results = $results->paginate($page_size);

        return $this->response->paginator($results, new SiteTransformer);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

}

SiteTransformer.php

<?php

namespace App\Http\Transformers;

use App\Models\Site;
use App\Models\City;
use App\Models\Customer;
use App\Models\Brand;
use App\Models\Sla;
use League\Fractal\TransformerAbstract;
use App\Http\Transformers\CityTransformer;
use App\Http\Transformers\CustomerTransformer;
use App\Http\Transformers\BrandTransformer;
use App\Http\Transformers\SlaTransformer;

class SiteTransformer extends TransformerAbstract
{
    // protected $availableIncludes = [
    //     'city'
    // ];

    protected $defaultIncludes = [
       'city', 'customer', 'brand', 'sla'
    ];

    
    public function transform(Site $site) : array
    {
        return [
            'id' => $site->id,
            'code' => $site->code,
            'name' => $site->name,
            'address' => $site->address,
            'address_bis' => $site->address_bis,
            'phone' => $site->phone,
            'fax' => $site->fax,
            'email' => $site->email,
            'active' => $site->active,
            'latitude' => $site->latitude,
            'longitude' => $site->longitude
        ];
    }

    public function includeCity(Site $site)
    {
        $city = City::find($site->city_id);

        return $this->item($city, new CityTransformer, 'include');
    }

    public function includeCustomer(Site $site)
    {
        $customer = Customer::find($site->customer_id);

        return $this->item($customer, new CustomerTransformer, 'include');
    }

    public function includeBrand(Site $site)
    {
        $brand = Brand::find($site->brand_id);

        return $this->item($brand, new BrandTransformer, 'include');
    }

    public function includeSla(Site $site)
    {
        $sla = Sla::find($site->sla_id);

        return $this->item($sla, new SlaTransformer, 'include');
    }
}

网站.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use App\Models\City;
use App\Models\Sla;
use App\Models\Brand;

class Site extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'customer_id', 'code', 'name', 'address', 'address_bis', 'city_id', 'phone', 'fax', 'email', 'longitude', 'latitude', 'active'
    ];

    public function customer()
    {
        return $this->hasOne('App\Models\Customer');
    }

    public function city()
    {
        return $this->hasOne('App\Models\City');
    }

    public function sla()
    {
        return $this->hasOne('App\Models\Sla');
    }

    public function brand()
    {
        return $this->hasOne('App\Models\Brand');
    }

}
4

0 回答 0