Laravel ORM 选择查询函数 load() on null

Posted

技术标签:

【中文标题】Laravel ORM 选择查询函数 load() on null【英文标题】:Laravel ORM select query function load() on null 【发布时间】:2016-05-03 08:29:40 【问题描述】:

这是我加载用户创建的提交的函数。

public function viewSubs()

    $user = User::find(Input::get('id'));
    $submissions  = Submission::find($user)->sortByDesc('created_at');

    $submissions->load('user')->load('votes')->load('suggestions.votes');

    return view('submissions.index' , compact('submissions'));

这会返回一个错误

在 null 上调用成员函数 load()

当没有提交记录时。

DB上没有提交怎么办?

【问题讨论】:

您需要绕过null 案例,您已经到了这一点,所以我认为检查null 值对您来说并不是什么大挑战。 【参考方案1】:

只需先使用 if 语句检查其 null

public function viewSubs()

    $user = User::find(Input::get('id'));

    if ($submissions  = Submission::find($user)->sortByDesc('created_at')) 
        $submissions->load('user')->load('votes')->load('suggestions.votes');
    

    return view('submissions.index' , compact('submissions'));

另外,根据您的数据库结构,我很确定您可以通过执行以下操作来利用模型的关系删减大量代码:

$user = User::find(Input::get('id'))
    ->with(['submissions'  => function($query) 
        $query->orderBy('created_at', 'asc');
    , 'submissions.votes', 'submissions.suggestions.votes']);

然后将$user 变量传递给视图,或者:

$submissions = Submission::with('user', 'votes', 'suggestions.votes')
    ->where('user_id', Input::get('id'))
    ->sortByDesc('created_at')
    ->first();

不完全确定代码能否完美运行,但我相信您可以对其进行调整。关键是通过使用您已经设置的关系,您的代码可以更短并且仍然/或更具可读性。

【讨论】:

以上是关于Laravel ORM 选择查询函数 load() on null的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配

laravel orm where 条件中 mysql函数 怎么用

来自 SQL 的 Laravel Eloquent ORM 聚合函数

laravel orm where 条件中 mysql函数 怎么用

如何在我的 Eloquent ORM laravel 选择中包含一个过程?

带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql