如何通过雄辩的关系选择模型功能-Laravel?

时间:2020-02-27 20:27:13

标签: laravel eloquent

在我的项目中,我有一个客户订单列表。每个订单都有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函数返回默认翻译。

1 个答案:

答案 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;
}