在我的项目中,我有一个客户订单列表。每个订单都有id_carrier字段以查找承运人名称(例如dhl,ups等)。问题是我需要使用模型载体中的函数getName()选择载体名称。
所以我的查询如下:
public function loadOrders()
{
$orders = Order::select('id', 'reference', 'created_at','total_value')->with(['carrier' => function($carrier){
$carrier->getName();
}])->paginate(20);
return $orders;
}
错误消息:
message: "Call to undefined method Illuminate\Database\Eloquent\Relations\HasOne::getName()"
模型顺序:
public function carrier()
{
return $this->hasOne('App\SupremeShop\Models\Carrier', 'id', 'id_carrier');
}
模型载体
public function getName()
{
return $this->translation->where('id_lang', 1)->first()->name;
}
所以我的查询返回的是ajax的结果,并且被datatable使用。所以我通过json作为完成结果。选择经典数据库字段没有问题-仅当我需要使用关系来获得承运人姓名时才出现问题。
如果我执行诸如foreaching订单列表之类的操作并调用$ order-> carrier-> getName(),我将毫无问题地获得承运人名称。但是在我的查询中,我在20个分页结果的上下文中使用getName(),但我不确定如何创建正确的sql查询。
每个订单都有一个承运人。每个运营商都有多种翻译。 GetName函数返回默认翻译。
答案 0 :(得分:1)
问题在于getName()方法是针对运营商模型的,而不是针对查询构建器的,因此您必须定义与翻译的访问名称的关系
// Carrier class
public function translationEng() // let think id_lang=1 is English
{
return $this->translation()->where('id_lang', 1);
}
// in controller
public function loadOrders()
{
$orders = Order::select('id', 'reference', 'created_at','total_value')->with(['carrier' => function($carrier){
$carrier->with(['translationEng' => function($query){
$query->select('name');
}]);
}])->paginate(20);
return $orders;
}
// you can access the name this way
foreach($orders as $order)
{
$carrierName = $order->carrier->translationEng->name;
}