Laravel Eloquent Model不会根据请求提交touch()或save()

时间:2013-06-07 20:26:21

标签: model laravel eloquent

这是路线

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()&#34 ;;使用" $ message-> readed_at =' 09-08-1986&#39 ;; $ MESSAGE->保存();"结果是一样的:它感觉像是工作,但数据库中没有任何变化。

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

抱歉我的英文。

1 个答案:

答案 0 :(得分:2)

经过几个小时的撞击砖墙后,我设法在Model :: save()方法的源代码中找到了这种行为的根源。你的问题(与我的相同)是没有明确定义的唯一(或主要)键作为" public static $ key"您的消息模型的属性。密钥的默认名称是' id'它用于在Model :: save()中构建更新查询。没有正确定义$ key =>没有更新发生。 $ key可以是表的主键,也可以是任何其他非主要但唯一的列。然后你的模型声明可能如下所示:

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

这解决了我的touch()/ timestamp()行为问题。不幸的是,我没有回忆起API文档中对此问题的任何引用。对于Laravel专家来说,对于在Model :: save()中形成UPDATE查询有明确的理解,但对于没有经验的Laravel用户来说,这可能是一个彻头彻尾的大脑破坏者。