繁体   English   中英

Laravel另一种追加模型的方式

[英]Laravel another way of appending to model

我正在建造一个api Laravel。 在我的消息模型中,我附加了以下内容:

/**
 * @var array
 */
protected $appends = ['subscribed'];


/**
 * @return mixed
 */
public function getSubscribedAttribute()
{
    return $this->isSubscribedBy();
}

IsSubscribedBy(); 生活在一个看起来像这样的特征:

/**
 * @return mixed
 */
public function isSubscribedBy()
{
    return $this->subscriptions()
        ->where('user_id', Auth::user()->id)
        ->exists();
}

这是工作,但这样做有n + 1问题,我无法加载algolia与php artisan scout:import "App\\Messages\\Message"的消息php artisan scout:import "App\\Messages\\Message"显然会抛出错误(因为没有人登录但它正在寻找某人: Auth::user()->id):

[ErrorException]
试图获得非对象的属性

那么有更好的方法吗? 我已经尝试过分形但是我仍然有n + 1问题。

- -编辑 - -

我这样回来了:

/**
 * @return mixed
 */
public function index()
{
    return Message::orderBy('created_at', 'DESC')
        ->paginate(10);
}

因此,对于每条消息,它将执行此查询:

$this->subscriptions()
        ->where('user_id', Auth::user()->id)
        ->exists();

如果用户根本没有登录,那么显然他们无法订阅。 所以你可以这样做:

public function isSubscribedBy()
{
    if(!Auth::check()) {
        return false;
    }
    return $this->subscriptions()
        ->where('user_id', Auth::user()->id)
        ->exists();
}

或者,如果你需要比其他一些falsenull刚刚返回来代替。

好了解如何急切加载它,首先你需要限制你对当前用户的急切加载:

return Message::orderBy('created_at', 'DESC')->with(['subscriptions'=> function ($query) {
    $query->where('user_id', '=', Auth::user()->id);
}])->paginate(10);

然后,它只会加载当前用户对邮件的订阅。 现在在你的属性getter中,你需要访问已经急切加载而不是雄辩的getter的集合。 您只需删除subscriptions() ()上的subscriptions()并使用集合方法而不是雄辩的方法(大多数情况下看起来完全相同)即可。 所以你的功能看起来像这样:

public function isSubscribedBy()
{
    return ($this->subscriptions->count() > 0);
}

希望这对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM