【问题标题】:How can i get data by using "with" laravel relationship function by a condtion?如何通过条件使用“with”laravel 关系函数来获取数据?
【发布时间】:2021-03-05 03:31:50
【问题描述】:

this is my table => 表格图片

//This is my controller
public function listUserStripeActionableRequests(Request $request) {
        return $model = UserRequest::whereNull('deleted_at')
            ->with('oldPackage')
            ->get();
}


userRequest.php

public function oldPackage() {
    return $this->hasOne(Package::class, 'id', 'old_package_id');
}

我需要根据表中的package_type获取数据 如果 package_type == 1 那么我需要从 Package::class 获取数据, 如果 package_type == 2 然后来自 AddOnsPackage::class 然后模型函数如下:- $this->hasOne(AddOnsPackage::class, 'id', 'old_package_id');

如何使用单个查询来相应地获取数据?

【问题讨论】:

    标签: php laravel eloquent eloquent-relationship


    【解决方案1】:

    你可以试试

    class UserRequest extends Model
    {
    
    
        public function package()
        {
            return $this->hasOne(Package::class, 'id', 'old_package_id');
        }
    
        public function addon()
        {
            return $this->hasOne(AddonPackage::class, 'type', 'add_on_type');
        }
    
        public static function sorted()
        {
            return static::whereNull('deleted_at')
                ->get()
                ->map(function ($record) {
                    if ($record->package_type === 1) {
                        $record->load('package');
                    } elseif ($record->package_type === 2) {
                        $record->load('addon');
                    }
    
                    return $record;
                });
        }
    }
    

    然后在控制器中你可以做

    public function listUserStripeActionableRequests(Request $request)
    {
        return $model = UserRequest::sorted();
    }
    

    【讨论】:

    • 不建议将 whereNull('deleted_at') 这样的条件放在一个叫做 scopePackageType 的范围内,这个条件应该在这个范围之外,或者至少,重命名你的范围以适应这个条件。我建议将此“位置”移动到另一个范围
    • 您好,感谢您的评论,我需要根据 package_type 获取数据检查我的表(i.stack.imgur.com/tfMtC.png)。如果 package_type == 1 则我需要从 Package::class 获取数据,如果 package_type == 2 然后从 AddOnsPackage::class 获取数据,则模型函数如:- $this->hasOne(AddOnsPackage::class, 'id', ' old_package_id'); .
    • 我想范围可以命名为byPackageType以提高可读性。使用软删除时,我猜 deleted_at 可以包含在范围内,我个人不介意。但是,它也可以从范围中排除。
    • @ShifasHassan 那么您可能还需要定义与AddOnsPackage 的关系。将更新我的演示答案
    • 实际上我们没有传递任何对 package_type 的请求。我们想从表中取出 package_type 并根据它做想要的关系。
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2021-03-16
    • 2018-10-24
    • 2020-12-30
    • 2020-11-27
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多