【问题标题】:Eloquent Query, possible Join雄辩的查询,可能的加入
【发布时间】:2017-07-16 13:08:48
【问题描述】:

我有三个模型:driver、designation 和 dpsObject,具有以下relationships:

驱动程序->hasMany(dpsObject) driver->belongsTo(Designation)

designation->hasMany(Driver)

dpsObject->belongsTo(Driver)

我正在尝试编写一个查询来返回一个 dpsObject 记录列表,这些记录对应于三个用户输入的值,它们是:一个日期范围(从和到)保存 dpsObject 中的 EntryDate 字段的值和一个 Designation 输入,保存着 Designation 对象中一个 Designation_name 字段的值。 目前这是我的查询:

$dps = dpsObject::where([['entryDate', '>=', $from],
                              ['entryDate', '<=', $to]]);

$from 和 $to 保存从表单用户提交的请求值。 我需要完成查询以捕获具有 dpsObject 记录的驱动程序的指定名称。挑战在于 designation_name 字段不存在于 dpsObject 模型上,而仅存在于驱动程序和指定模型上。这就是我想要维护数据库模型的方式。我想我需要使用连接或类似的东西,但我不知道该怎么做。

编写此类查询的最佳方法是什么?

亲切的问候

【问题讨论】:

    标签: mysql laravel laravel-5 eloquent laravel-eloquent


    【解决方案1】:

    你可以使用嵌套的whereHas():

    $dpsObjects = dpsObject::whereBetween('entryDate', [$from, $to])
        ->whereHas('driver', function ($q) use($designationName) {
            $q->whereHas('designation', function ($q) use($designationName) {
                $q->where('designation_name', $designationName);
            });
        })
        ->get();
    

    这里,designationdriverbelongsTo() 关系。

    【讨论】:

    • @Alexy 这是我遇到的错误。 SQLSTATE [HY000]:一般错误:1267 非法混合排序规则 (utf8mb4_general_ci,IMPLICIT) 和 (utf8mb4_unicode_ci,IMPLICIT) 用于操作 '=' (SQL: select * from dps_objects where entryDate 在 2017-07-01 和 2017 之间-07-01 并且存在(从drivers 中选择*,其中dps_objects.driver_no = drivers.driver_no 并且存在(从designations 中选择*,其中drivers.designations .designation_namedesignation_name = Total))) 这与关系的设置方式有关吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2015-07-07
    • 2018-01-26
    • 2014-04-12
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多