在我的项目中,我使用 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');
}
}