【问题标题】:Laravel deep relation queryLaravel 深度关系查询
【发布时间】:2020-04-14 20:05:38
【问题描述】:

我需要让我的模型建立深厚的关系,但它会返回

SQLSTATE[42000]:语法错误或访问冲突:1055 表达式 #5 的 SELECT 列表不在 GROUP BY 子句中并且包含非聚合 列“gis-web.areas.id”在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by (SQL: select zone_regions., areas., segments.* 来自 zone_regions 内部连接 ​​areas on areas.zone_id = zone_regions.id 内连接 hthree_regions on hthree_regions.area_id = areas.id 内连接 segments on segments.hthree_id = hthree_regions.id 分组 zone_regions.id)

代码

$data = DB::table('zone_regions')
        ->join('areas', 'areas.zone_id', '=', 'zone_regions.id')
        ->join('hthree_regions', 'hthree_regions.area_id', '=', 'areas.id')
        ->join('segments', 'segments.hthree_id', '=', 'hthree_regions.id')
        ->select(
            'zone_regions.*',
            'areas.*',
            'segments.*'
        )
        ->groupBy('zone_regions.id')
        ->get();

逻辑

  1. zone_regionsareas
  2. areashthree_regions
  3. hthree_regionssegments
  4. 等等我会添加...

我想从这些数据中得到什么?

我需要获取zone_regions 下方所有内容的计数,例如:

zone_regions 120 areas2000 hthree_regions16000 segments

所以我可以计算所有与此 zone region 相关的行,这就是我想要实现的目标。

有什么想法吗?

【问题讨论】:

  • 您正在使用GROUP BY,但没有选择任何计数聚合。你打算发布一些其他 Laravel 查询吗?
  • @TimBiegeleisen 不,这是我拥有的代码,请随时指出我犯错的地方。谢谢
  • mysql 5.75+ 包含only_full_group_by 模式,它只允许你选择groupBy中的字段和聚合函数。
  • 另一个问题是您要从差异表中选择所有字段。这些表中的每一个都有相同的primary_key idid 中只有一个可以工作,其他的会被覆盖。
  • @TsaiKoga 谢谢你已经解决了这个问题,将分享我的解决方案

标签: php mysql laravel


【解决方案1】:

已解决

由于在查询方法上苦苦挣扎,我决定使用模型绑定函数hasManyThroughsource

我在我的模型中定义了 3 个新函数,并在我的变量 (with) 中调用了它们,现在我有了我想要的数据。

代码

Model

class ZoneRegion extends Model
{
    protected $fillable = [
        'name',
    ];

    public function areas(){
        return $this->hasMany(Area::class, 'zone_id', 'id');
    }

    public function segments()
    {
        return $this->hasManyThrough(Segment::class, HthreeRegion::class, 'area_id', 'hthree_id');
    }

    public function links()
    {
        return $this->hasManyThrough(Link::class, Segment::class, 'hthree_id', 'segment_id');
    }

    public function cabels()
    {
        return $this->hasManyThrough(CableType::class, Link::class, 'cable_id', 'id');
    }
}

Controller

$zones = ZoneRegion::orderby('id', 'desc')->with(['areas', 'segments', 'links', 'cabels'])->get();

它成功了,现在我需要做的就是获取我的数据的length(JS 方法)或我的数据的count()(刀片方法)

希望它也可以帮助其他人。

【讨论】:

    【解决方案2】:

    根据您的错误,问题出在您的数据库上,它说您已启用

    sql_mode=only_full_group_by

    禁用此模式

    SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    

    有关更多信息,您可以查看此文档https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

    尽管如此,我可以看到你的查询没有得到你想要的,你需要像 count 这样的聚合函数。

    data = DB::table('zone_regions') ->join('areas', 'areas.zone_id', '=', 'zone_regions.id') ->join('hthree_regions', 'hthree_regions.area_id', '=', 'areas.id') ->join('segments', 'segments.hthree_id', '=', 'hthree_regions.id') ->select( 'zone_regions.id' , DB::raw(' SUM(case when areas.id IS NOT NULL then 1 else 0 end) as areas,  SUM(case when hthree_regions.id.id IS NOT NULL then 1 else 0 end) as hthree_regions), SUM(case when segments.id IS NOT NULL then 1 else 0 end) as segments')->groupBy('zone_regions.id') ->get();
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      这是因为你的 Laravel 没有关闭“严格模式”。

      解决方案:

      1. 打开yourproject/config/database.php
      2. 找到strict => true(改成false)

      别忘了运行php artisan config:cache

      【讨论】:

      • 修复了错误,但另一方面数据只是从segments 表返回,zone_regionshthree_regions 都没有。似乎只有最新的->join()
      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 2021-12-06
      • 2023-03-13
      • 2021-05-05
      • 1970-01-01
      • 2019-01-23
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多