2015-04-05 53 views
6

假设我有以下两种模式之间的Laravel雄辩的关系:更新在Laravel雄辩的一到多的关系

<?php 

    // user: 
    // - user_id 
    class User extends Model 
    { 
     protected $table = 'users'; 

     public function settings() 
     { 
      return $this->hasMany('Setting'); 
     } 

     public function settingSet($key, $value) 
     { 
      \Setting::setConfigItem($key, $value, $this->user_id); 
     } 

    } 

    // settting: 
    // - setting_key 
    // - setting_value 
    // - user_id 
    class Setting extends Model 
    { 
     public function setConfigItem($key, $value, $user_id) 
     { 
      // Note: I've provided this code here as an example, so it should 
      // exist here only as pseudo-code - it has not been tested and 
      // is outside the scope of this issue but has been requested by 
      // a commenter so I've provided the basis for this method: 
      $existing = \Setting::where(['key' => $key, 'user_id' => $user_id])->first(); 
      if (!$existing) { 
       \Setting::insert([ 'setting_key' => $key, 'setting_value' => $value, 'user_id' => $user_id ]); 
      } else { 
       $existing->setting_value = $value; 
       $existing->save(); 
      } 
     } 
    } 

我要检索单个用户和他的设置,我可以做以下内容:

<?php 
$user = User::with(['setting'])->find(1); 

现在,这个用户,我可以更新或使用settingSet方法插入一个设置,如上列出。

<?php 
$user->settingSet('foo','bar'); 

但是,如果我现在检索设置,我会得到陈旧的数据。

<?php 
print_r($user->settings); // onoes! 

什么给力的数据,这种关系的INSERT/UPDATE后进行更新/删除User::settingSet方法或其他类似方法,最好的做法?

+0

你确定你是在救你$用户> settingSet($键,$值)中设定的设置? – martindilling 2015-04-07 09:31:37

+0

@martindilling是的,下一页刷新显示新值。 – gpmcadam 2015-04-10 16:20:04

+0

你可以显示'settingSet'方法吗? – Gal 2015-04-10 16:48:53

回答

1

您可以使用Lazy Eager Loadingload()函数强制更新数据。

print_r($user->load('settings')); 

来源:http://laravel.com/docs/5.0/eloquent#eager-loading

+0

Eager loading是绝对正确的答案,谢谢!我修改了'User'模型以运行'$ this-> load('settings')'以引入更改,它按预期工作。谢谢。 – gpmcadam 2015-04-10 22:45:12

0

你有这个问题,由于使用查询生成器,而不是雄辩,我不明白为什么你使用两个,如果你使用雄辩然后使用雄辩如果您使用查询生成器使用查询生成器,但不使用,至少在你不可能的时候不行。

我找到setConfigItem方法没用,因为你的arent推动用户进入设置,但设置成用户所以基本上所有implementions应该对用户类,而不是在设置类

清除了这一点后,你可以尝试做这样的事情 -

public function settingSet($key, $value) 
{ 
    $setting = new Setting([ 
     'setting_key' => $key, 
     'setting_value' => $value 
    ]); 
    $this->settings()->save($setting); 
} 

,你也可以通过改进而不是只接受1设置在同一时间,你可以接受的设置

顺便说一句阵列的这种方法是有一个原因你没有使用数据透视表?是唯一的foreach用户的设置?

+0

回答你的问题:1.我在这里展示了一个人为的例子,但实际的设置模型不仅仅是用户设置的责任。 2.不需要数据透视表,请参阅答案1 - 将“设置”视为可用于多种用例的键值存储区。 – gpmcadam 2015-04-10 22:41:12