App\Models\ 必须返回一个关系实例

Har*_*ist 6 php laravel

我正在尝试根据数据库字段的值运行一些动态方法调用。一些背景信息:我有一个模型Anniversary,我想在接下来的 x 天内显示所有即将到来的周年纪念日。周年纪念日有 adate和 a frequency。例如,每月、每季度等。根据频率,我想检查每个周年纪念日是否即将到来。

到目前为止,这是我的代码:

$anniversaries = auth()->user()->anniversaries()->get();

$test = $anniversaries->filter(function ($anniversary) {
    $method = Str::of($anniversary->frequency)->camel();
    return ${$anniversary->$method}() == true;
});

dd($test);
Run Code Online (Sandbox Code Playgroud)

当我在实际方法中做dd()一些事情时,上面的方法是有效的。但是当返回 true 或 false 时,我收到错误:

App\Models\Anniversary::monthly must return a relationship instance
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我只有一些如下所示的方法用于测试:

public function monthly()
{
    return true;
}

public function quarterly()
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我唯一的问题是,我想了解为什么我会收到此错误,当然还有任何指向正确方向的指针以实现我想要的工作。谢谢!

Maa*_*Dev 2

以下行创建一个Illuminate\Support\Str对象而不是字符串。这会导致Method name must be a string错误。

$method = Str::of($anniversary->frequency)->camel();
Run Code Online (Sandbox Code Playgroud)

您可以通过手动将其转换为字符串并直接调用它来修复此问题:

$test = $anniversaries->filter(function ($anniversary) {
    $method = (string) (Str::of($anniversary->frequency)->camel());
    return $anniversary->$method() == true;
});
Run Code Online (Sandbox Code Playgroud)