【问题标题】:Synchronise Laravel Eloquent instances同步 Laravel Eloquent 实例
【发布时间】:2015-11-05 15:00:51
【问题描述】:

我们在 Web 应用程序中遇到的一个大问题是实例通常不同步。也就是说,假设我们有一个带有回复的帖子。

class Post extends Model
{
    public function replies()
    {
        return $this->hasMany('Reply');
    }
}

class Reply extends Model
{
    public function post()
    {
        return $this->belongsTo('Post');
    }
}

如果我知道使用$post->replies 获得所有回复,我可以再次使用$r->post 检索每个回复$r 的帖子。这不会执行新的查询,因为显然它的值是在加载所有回复时填写的。然而,我确实注意到$r->post 的每个实例都是Post 的不同实例而不是原始实例。

这是问题开始的地方,因为在我们的(可以说是更复杂的)应用程序中,我们经常在回复上调用方法,然后当我们使用原始帖子继续我们的应用程序时,它还没有根据回复可能所做的更改。

就个人而言,我非常希望这些实例是平等的。更准确地说,每次我使用例如检索对象时Post::find($id) 我想要相同的实例,假设 $id 是相等的。有没有办法强制这种行为?我考虑过以某种方式使用缓存,但它需要大量缓存,而且我不确定如何确保处理这些关系的 Laravel 代码也会受到影响以从缓存中获取实例。

【问题讨论】:

  • 我希望我有更多你的应用程序,这样我就可以更深入地了解这里发生的事情。听起来网站上的用户创建了一个修改帖子的回复,但是下一个用户尝试加载该帖子正在获取旧帖子?你是什​​么意思“当我们使用我们的原始帖子继续我们的应用程序时”?回复发生在您已经加载帖子的执行过程中?
  • 你肯定需要发布一些代码来展示你所解释的内容,因为它本身的解释太复杂了。
  • 这不是一个完整的答案,但您正在谈论实例化 VS 寻址之间的区别。您需要以某种方式单身您的 $posts 。这不是很“雄辩”,但它可能看起来像:$posts[$id]['replies'][$replyId]->cool_reply_method() 两者之间的区别在于父数组中的已寻址对象 PERSISTS 可以稍后被寻址,并且您将获得相同的对象实例。我很好奇处理这个问题的雄辩方式是什么。

标签: php laravel laravel-5


【解决方案1】:

我在运行验收测试时遇到了类似的情况。

这是我目前的解决方法,直到我弄清楚为什么在某些环境中 PDO 实例似乎被锁定。

config/database.php 中复制您的默认连接:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

'mysql_alt' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
]

现在,如果需要,您可以按照以下方式进行:

Model::on('mysql_alt')->find($id)

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2016-12-15
    • 2019-02-11
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2020-12-31
    • 2018-09-25
    • 2022-01-15
    相关资源
    最近更新 更多