【问题标题】:Laravel return empty relationship on model when condidtion is true当条件为真时,Laravel 在模型上返回空关系
【发布时间】:2018-09-23 12:11:55
【问题描述】:

我有一个模型,我想在条件发生时返回一个空值,但是当我尝试获取模型时:

Model::with('shop')->find(id);

我收到此错误:

“在 null 时调用成员函数 addEagerConstraints()”

这是我正在尝试的代码:

public function shop(){
    if(true) {
        return null;
    }
    return $this->belongsTo('App\Models\Shop');
}

当 Laravel 关系上的条件为真时,不返回任何内容的正确方法是什么?

【问题讨论】:

  • 怎么称呼关系?
  • @ab_ab 编辑了问题。
  • 我们能看到详细的错误吗?
  • @ab_ab 出现跟踪错误

标签: laravel laravel-5 laravel-5.1 relationship


【解决方案1】:

返回BelongsTo 实例的正确方法。

public function shop(): BelongsTo
{
    if(true) {
        return new BelongsTo($this->newQuery(), $this, '', '', '');
    }
    return $this->belongsTo('App\Models\Shop');
}

【讨论】:

  • 我更喜欢这个,因为它返回一个 BelongsTo
  • 当我使用它时,集合资源给出了一个错误,例如 Error: Call to a member function first() on null in file C:\xampp\htdocs\www\big_crm\vendor\laravel\framework \src\Illuminate\Http\Resources\CollectsResources.php 第 29 行
【解决方案2】:

将您的查询包装在 rescue 助手中:

// continue processing if an exception happens.
// return some default value if the query does not succeed, null for example.
return rescue(function () {
    // some custom logic here
    return $this->belongsTo('App\Models\Shop');
}, null);

更新

对于 5.1 尝试返回一个新的模型实例:

public function shop(){
    if(true) {
        return new static;
    }
    return $this->belongsTo('App\Models\Shop');
}

更新 2

尝试返回模型的query builder

public function shop(){
    if(true) {
        return $this->newQuery(); // or newQueryWithoutScopes()
    }
    return $this->belongsTo('App\Models\Shop');
}

【讨论】:

  • 它适用于 Laravel 5.6,但我使用的是 Laravel 5.1 :)
  • 抱歉,没注意到 5.1 标签。
  • 赞成,因为这是在 Laravel +5.5 上正确的做法。
【解决方案3】:

我认为你可以使用这个技巧 - 在满足条件时设置一个不可能的查询条件:

public function shop(){

    return $this->belongsTo('App\Models\Shop')->where(function($query) {

        if ($condition) {

            // I think this should do the trick
            $query->whereNull('id');
        }

    });

}

【讨论】:

  • 当我想在那里有一个空值时,它不会抛出错误,但它会返回一个空数组。
  • 嗯,在我尝试过的代码上,它实际上返回了 null。也许这是 5.1 的事情。让我检查一下
  • 进行了全新安装并且它可以工作,对于 belongsTo 关系,如果它们是 hasMany 返回一个空数组。你的代码是正确的。
  • 是的,它应该在 1 条记录上为空,或者如果有很多则为空数组/集合。它仍然尊重标准查询:)
猜你喜欢
  • 2015-04-18
  • 2021-12-20
  • 2017-11-23
  • 2022-01-02
  • 2020-11-06
  • 2016-06-21
  • 1970-01-01
  • 2013-04-10
  • 2014-10-15
相关资源
最近更新 更多