hasMany预加载关联进行get()查询,提示 Function name must be a string

1. 运行环境:php7.3 + apache2 + mysql8

1). 当前使用的 Laravel 版本?

Laravel 8.40

2). 当前使用的 php/php-fpm 版本?

PHP 版本:

php-fpm 版本:7.3

3). 当前系统

windows10

4). 业务环境

正常开发环境

5). 相关软件版本

apache2.4

2. 问题描述?

目前我有两张表,分别是brand_type,brand_type_serve进行了以下关联

public function getService()
    {
        return $this->hasMany(BrandTypeService::class, 'brand_type_id', 'id');
    }

brand_type表内数据情况如下

brand_type_serve表内数据情况如下

关联查询语句如下

 $builder = BrandType::with([
    'getService.getPresentation.getDesc'
])->get();

当我避开能关联成功的brand_type中id为1,7,14的数据时候可以成功查询,如果查询所有会出现以下报错

如果我用first进行单条查询id为1,7,14的数据不会出现这种错误
调试发现关联查询没有问题,查询成功后处理关联数据时候出错,一下为报错行方法

public function makeListener($listener, $wildcard = false)
    {
        if (is_string($listener)) {
            return $this->createClassListener($listener, $wildcard);
        }

        if (is_array($listener) && isset($listener[0]) && is_string($listener[0])) {
            return $this->createClassListener($listener, $wildcard);
        }

        return function ($event, $payload) use ($listener, $wildcard) {
            if ($wildcard) {
                return $listener($event, $payload);
            }
            return $listener(...array_values($payload));//此为报错行
        };
}

其实正常情况下$wildcard应该为true根本走不到报错行,而且$listener本应该是一个数组,此处却返回的是对象,不得已情况下我在patent_type_serve模型下加了以下方法

public function __invoke()
{
        return null;
}

可临时处理该bug,可这个方法并不能完整达到我心理需求,各位同仁们有没有遇到过类似情况的解决方案或思路

另外 在windowsServe服务器下nginx环境中有同样问题,尝试过laravel降级至8.0也wei’nen

3. 您期望得到的结果?

4. 您实际得到的结果?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 3

补充:如果我给brand_type_serve表新建一个模型,例如模型名为Test来进行关联,未出现这个问题

3年前 评论

getService.getPresentation.getDesc 是关联的(service)关联的(resentation)关联(desc)? :flushed:

3年前 评论
Leimon1314 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!