Laravel 4创建表单以添加关系记录

时间:2014-09-26 11:26:16

标签: php forms laravel-4 model

我创建了非常基本的模型。我有人员表和电子邮件表。 我还在persons/show.blade.php(“添加邮件”)中创建了一个链接。 我的模特是

class Person extends Eloquent {

    protected $table = 'persons';

    public function email()
    {
        return $this->HasMany('Email');
    }

}

class Email extends Eloquent {

    protected $table = 'emails';

    public static $rules = array(
        'email'=>'required|unique:emails'       
    );

    public function person()
    {
        return $this->belongsTo('Person');
    }
}

如何将$person->id传递给新的控制器?

在我的show.blade.php Person我添加了

{{ HTML::linkRoute('email.adduseremail','Προσθήκη Email',array($person->id))}}

我加入了我的EmailController

public function adduseremail($id)
{
    return View::make('email.createforuser',['id'=>$id]);
}

public function storeforuser($pid)
{
    $validator = Validator::make(Input::all(),Email::$rules);

    if ($validator->fails()) {
        $messages = $validator->messages();
        foreach ($messages->all('<li>:message</li>') as $message)
        return Redirect::back()->withInput()->WithErrors($messages);
    }
    $person = Person::FindorFail($pid);

    $email = new Email;
    $email->email = Input::get('email');
    $email->person()->associate($person);
    $email->save();

    return Redirect::route('person.index');
}

我的createforuser视图

<p>
{{Form::open(['route'=>'email.storeforuser'])}}
<div>
    {{Form::label('email', 'Email:')}}  
    {{Form::input('text', 'email')}}
    {{$errors->first('email')}}
</div>
</br>
<div>
{{Form::submit('Submit')}}
</div>
{{Form::close()}}
<p>

我一直试图获取非对象的属性(查看:/var/www/laravel/app/views/email/show.blade.php

有没有使用Form和Models将新对象插入数据库以获取'belongsTo'关系的示例?我找不到任何完整的,只是部分的例子。

2 个答案:

答案 0 :(得分:1)

我通常使用laravel会话或laravel缓存来临时保存我需要稍后使用的id,如:     会议::设置(&#39; PERSONID&#39;,$人 - &GT; ID);     会话::得到(&#39; PERSONID&#39);

同样适用于缓存,除了缓存只会持续当前请求会话是持久的会话 希望有所帮助

答案 1 :(得分:0)

我不确定我是否应该回答我自己的问题,但最后我找到了解决方案。 我设置了两条新路线

Route::post('email/adduseremail/{pid}', array('uses'=>'EmailController@adduseremail','as' => 'email.adduseremail'));
Route::post('email/storeforuser/{pid}', array('uses' =>'EmailController@storeforuser','as' => 'email.storeforuser'));

并在我的Controller中创建了相应的方法

public function adduseremail($id)
{
$pname = Person::Find($id)->name;
$psurname = Person::Find($id)->surname;

return View::make('email.createforuser',array('id'=>$id,'name'=>$pname, 'surname'=>$psurname));
}

public function storeforuser($pid)
{
$validator = Validator::make(Input::all(),Email::$rules);
if ($validator->fails())
    {
    $messages = $validator->messages();
    foreach ($messages->all('<li>:message</li>') as $message)
    return Redirect::back()->withInput()->WithErrors($messages);
    }
    $person = Person::FindorFail($pid);
    $email = new Email;
    $email->email = Input::get('email');
    $email->person()->associate($person);
    $email->save();

    return Redirect::route('person.show',array($person->id));

}

然后在我的查看刀片页面上,我可以将参数从View传递给Form等等

person.show.blade.php


{{Form::Open(array('route' => array('email.adduseremail', $person->id),'method' => 'POST','style'=>'display:inline;'))}}
{{Form::submit('Add Email')}}
{{Form::close()}}

email.createforuser.blade.php

{{Form::open(array('route'=>array('email.storeforuser',$id),'method' => 'POST','style'=>'display:inline;'))}}
{{Form::label('email', 'Email:')}}  
    {{Form::input('text', 'email')}}
    {{Form::submit('Submit')}}

希望它也有助于其他人