Laravel - 在提交时存储用户和他/她动态创建的关系的最佳方式

时间:2016-09-15 11:41:32

标签: laravel laravel-5 submit one-to-many

我应该以哪种方式存储“动态”制作的用户关系?

我的意思是。例如,现在丈夫可以添加与他(hasMany)他的妻子和孩子的关系,我有人表,记录为husband。现在我已经设置了模型并且它可以正常工作

型号

这种关系在同一个表中,因为数据对他们来说是相同的我只需要知道它们是否属于husband

public function children(){
   return $this->hasMany( get_class($this) ,'people_id','id');        
}
public function parent(){     
   return $this->belongsTo( get_class($this) , 'people_id','id');
}

现在我去表格并在那里添加一个人husband。我可以选择动态添加他的children()(他的妻子,他的孩子,他的祖母......)并在完成后提交。

现在我已经考虑将这些children首先保存到Session(将它们放在数组中)并提交以将其发布到控制器。这是一个好方法还是应该以其他方式做到?

(我希望我解释得很好,如果不是,我会尝试更好地解释它)

1 个答案:

答案 0 :(得分:0)

我这样做了我不知道这种方式是否合适但它对我有用。另外要添加我刚刚使用DB数据的名称,因为我想让它工作。

将父母及其子女(如果有)存储在会话

中的数据库中
public function store(AdminCreatePersonRequest $request) 
{

 $data = $request->all();

 $parent =  new Person;

 $parent->name = $data['name'];

 $parent->save();

 $children = $request->session()->pull('children');


 if ($children != null) {

    foreach($children as $childData){

        $child = new Person(['name' => $childData['child-name']]);
        $parent->children()->save($child);

    }
 }

return redirect('dashboard')->with('success', ['The user was successfully created']);

}

<强> AJAX

将儿童添加到会话

public function add(AdminCreatePersonChildRequest $request) 
{
    $temp = $request->session()->get('children',[]); 

    $data = $request->all(); 

    unset($data['_token']); 

    array_push($temp,$data); 

    end($temp); 

    $key = key($temp); 

    $data += ['id' => $key]; 

    $request->session()->put('children', $temp); 

    return $data;
}

从会话中移除儿童

 public function delete(Request $request, $id) {

        $temp = $request->session()->pull('children');
        unset($temp[$id]);
        $request->session()->put('children', $temp);

        return 1;

 }  

在视图创建(如果有)

的会话中加载子项
public function load(Request $request) //get children from session (if exists)
{
    $data = $request->session()->get('children');
    if($data != null){
        return $data;
    }

    else {
        return 0;
    }
}

清除会话中的所有儿童

public function clear(Request $request) //remove children from session
{
   $request->session()->forget('children');

   return 1;
}

使用数据表单控制器,您可以更新视图(在我的情况下,将<li>添加到<ul>元素)