0

这是路线

Route::get('test', array('before' => 'auth', 'as' => 'asd', function()
{
$userid = '2';
$result = Messages::whereIn('from', array($userid, Auth::user()->id))
                    ->whereIn('to', array($userid, Auth::user()->id))
                    ->orderBy('sended', 'desc')
                    ->join('ucpm_users', 'ucpm_messages.from', '=', 'ucpm_users.id')->join('metadata_personas', 'ucpm_users.persona', '=', 'metadata_personas.id')
                    ->select('from','ucpm_users.username','metadata_personas.first_name','metadata_personas.last_name','message','ucpm_messages.created_at','ucpm_messages.updated_at','ucpm_messages.readed_at')
                    ->get();
    $result->each(function($message)
        {
                $message->touch();
        });
print_r($result);

}));

执行时,它会打印条目对象集合,例如:

               [attributes:protected] => Array
                    (
                        [from] => 2
                        [username] => criser
                        [first_name] => Cristian
                        [last_name] => Leal
                        [message] => asdqweasd
                        [created_at] => 2013-06-07 20:11:31
                        [updated_at] => 2013-06-07 24:31:52
                        [readed_at] => 1986-09-08 00:00:00
                    )

                [original:protected] => Array
                    (
                        [from] => 2
                        [username] => criser
                        [first_name] => Cristian
                        [last_name] => Leal
                        [message] => asdqweasd
                        [created_at] => 2013-06-07 20:11:31
                        [updated_at] => 2013-06-07 24:31:52
                        [readed_at] => 1986-09-08 00:00:00
                    )

没有任何错误响应或任何东西。并且 Attributes 和 Original 数组都使用当前时间戳更改了 updated_at 字段。没关系,这就是我想要的工作方式,但是.. 他们不会对数据库进行任何更改。updated_at 字段或任何内容没有变化。它让我感到困惑,为什么模型会发生变化并向我展示了变化,但没有考虑到这些变化。

另外,如果我更改“$message->touch()”;带有“$message->readed_at = '09-08-1986'; $message->save();” 结果是一样的:感觉就像工作,但在数据库中没有进行任何更改。

路线(不是这条路线,这只是一个测试),从当前登录用户与另一个用户恢复所有消息并打印一个 json 响应。我的想法是,当它加载时,如果 created_at 日期与 updated_at 相同,则消息是未读的,因此我想更改它(或使用 readed_at 字段,无论如何......)。

对不起我的英语不好。

4

1 回答 1

2

经过几个小时的努力,我设法在 Model::save() 方法的源代码中找到了这种行为的根源。您的问题(与我的相同)是缺少明确定义的唯一(或主)键作为消息模型的“公共静态 $key”属性。键的默认名称是“id”,它用于在 Model::save() 中构建更新查询。没有正确定义 $key => 没有更新发生。$key 可以是表的主键,也可以是任何其他非主但唯一的列。那么您的模型声明可能如下所示:

class MyModel extends Eloquent
{
    public static $key = 'my_unique_key';
    ...
}

这解决了我的 touch() / timestamp() 行为问题。不幸的是,我不记得在 API 文档中对这个问题的任何引用。对于 Laravel 专家来说,对在 Model::save() 中形成 UPDATE 查询有清晰的理解,这似乎很明显,但对于没有经验的 Laravel 用户来说,这将是一个彻头彻尾的脑残。

于 2013-06-24T02:10:35.253 回答