php - Laravel 另一种附加到模型的方法

标签 php laravel

我正在构建一个 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 问题,我无法使用 php artisan scout:import "App\Messages\Message"在 algolia 中加载消息 这显然会引发错误(因为没有人登录但它正在寻找某人:Auth::user()->id):

[ErrorException]
Trying to get property of non-object

那么有没有更好的方法呢?我已经尝试过分形,但我仍然遇到 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();
}

或者,如果您需要 false 以外的东西,例如 null,只需返回它即可。

确定了如何预先加载它,首先你需要将你的预先加载限制为当前用户:

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

然后它只急切地加载当前用户对消息的订阅。现在在您的属性 getter 中,您需要访问已经急切加载的集合,而不是 Eloquent getter。您只需删除 subscriptions() 上的 () 并使用集合方法而不是 Eloquent 方法(大部分时间看起来完全相同)即可完成此操作。所以你的函数看起来像这样:

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

希望这对你有用。

关于php - Laravel 另一种附加到模型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698991/

相关文章:

php - Blade 模板和单选按钮 - 在 foreach 循环中选择第一个

laravel - 在vue cli项目中,Laravel api app放在哪里,vue js中如何调用api?

php - 在 CakePHP 上设置关联

php - 用JavaScript代替跨域请求

php - 语法错误或访问冲突 : 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

php - Laravel:PHP Artisan Migrate 抛出 PDO 异常:找不到驱动程序 (Postgres)

jquery - 在 Laravel 中使用 Blade 模板打印 php 标签内的 JavaScript 变量值

php - UTF8 php-ajax-jquery 问题?

php - 测量 PHP 脚本的时间 - 使用 $_SERVER ['REQUEST_TIME' ]

php - Zend 表单文件上传不会验证或上传文件