【问题标题】:How to select model function via eloquent relation - laravel?如何通过雄辩的关系选择模型函数 - laravel?
【发布时间】:2020-02-27 20:27:13
【问题描述】:

在我的项目中,我有一个客户订单列表。每个订单都有 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 的结果,它被数据表使用。所以我通过 json 作为完成结果。选择经典数据库字段没有问题 - 只有当我需要使用关系来获取运营商名称时才会出现问题。

如果我执行查询订单列表之类的操作并调用 $order->carrier->getName() 我将毫无问题地获得运营商名称。但在我的查询中,我在 20 个分页结果的上下文中使用 getName(),我不确定如何创建正确的 sql 查询。

每个订单都有一个承运人。每个运营商都有多个翻译。 GetName 函数返回默认翻译。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    问题在于 getName() 方法适用于 Carrier 模型而不适用于查询构建器,因此您必须定义一个关系以通过翻译访问名称

    // 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;
    }
    

    【讨论】:

    • 感谢鲁本的帮助 - 你的回答是我问题的完美解决方案。我会为其他人添加一些提示:在我的订单查询中有字段选择 - 在字段列表中必须是相关模型的前键,如 id_carrier 否则它将一直返回 null。我还有第二个关系载体 -> 翻译 -> 字段列表中也必须有 id_carrier。
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2013-06-04
    • 2016-11-26
    • 2018-02-19
    • 2015-01-29
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多