【问题标题】:Laravel 5.1 Eager Loading - belongsToMany with parameterLaravel 5.1 急切加载 - 带参数的 belongsToMany
【发布时间】:2015-12-16 09:37:11
【问题描述】:

我的模型中有这种关系:

public function modulesData($module) {
    return $this->belongsToMany($module)
        ->withTimestamps();
}

我想要的是预先加载模型的动态关系。但是我该怎么做呢? 我使用此代码来预先加载我的关系,但如何添加参数$module

$model->with(['modulesData'])->get();

感谢回复。

【问题讨论】:

  • 哇,我什至不知道您可以将参数传递给您的关系。
  • 是的,它适用于参数。我什至需要这个,因为我使用模型的动态模块关系。

标签: php orm laravel-5.1 relationship has-and-belongs-to-many


【解决方案1】:

考虑以下几点:

为你的模型定义回退函数:

public function __call($name, $arguments)
{
    if (strpos($name, 'modulesData') !== false) {
        $nameArray = explode(' ', $name);
        $moduleName = ucfirst($nameArray[1]);
        $moduleClass = 'App\Modules\\' . $moduleName . '\\' . $moduleName;
        return $this->modulesData($moduleClass);
    } else {
        return parent::__call($name, $arguments);
    }
}

以这种方式使用with函数:

$tal = \App\Model::with('modulesData ModuleName')->get();

(“ModuleName”是您要用作关系参数的模块的名称)。

这样您就可以使用字符串“modulesData_moduleName”进行预加载。当with 被调用时,它不会找到那个函数,并会回退到__call,这将提取“moduleName”并将关系“modulesData”作为参数调用。

【讨论】:

  • 这是一个有趣的方法.. 但这不起作用,因为 laravel 模型类中已经有一个 __call 函数。 (vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php) ...我收到错误“在 null 上调用成员函数 orderBy()”
  • @goldlife 没问题:更新为调用 parent::_call 以防它与我们正在寻找的内容不匹配
  • hm 还有错误:“在布尔值上调用成员函数 orderBy()”.. 而不是“在 null 上调用成员函数 orderBy()”
  • 您的代码提供了解决方案的方法。它现在可以使用以下代码: public function _call($name, $arguments) { if (strpos($name,'modulesData') !== false) { $nameArray = explode('', $名称); $moduleName = ucfirst($nameArray[1]); $moduleClass = 'App\Modules\\'.$moduleName.'\\'.$moduleName;返回 $this->modulesData($moduleClass); } else { return parent::__call($name, $arguments);您的代码中的 return false 是错误的。它必须是 return parent::_call。请改一下,我会接受的。
  • @goldlife 哦,您评论代码的细微变化:评论中的分隔符为空,在答案代码中替换为空格。并且还将with 调用中的下划线替换为另一个espace。团队合作!
【解决方案2】:

我不知道如何传递参数,但你可以这样做:

$model->with(['modulesData' => function($q) {
    $q->withTimestamps();
}])->get();

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 2018-12-11
    • 1970-01-01
    • 2015-05-29
    • 2016-03-22
    • 2014-08-13
    • 2021-04-23
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多