【问题标题】:Laravel HasMany create child recordLaravel HasMany 创建子记录
【发布时间】:2022-02-21 10:53:47
【问题描述】:

我在尝试创建与其父级关联的子模型时遇到问题。

我有 2 个模型:

  • 机构(有很多地址)
  • 地址(有 1 个机构)

当我点击一个机构并转到 show.blade.php 时,我有一个表单来为该机构创建一个地址,我无法从请求中获得将孩子与父母相关联的字段“instituion_id”。

这显示在请求中:

请求数据

从我调用以下路线的表格中:action="/institution/{{ $institution->id }}/addresses"

这是 AddressController 中的代码:

public function store(Request $request)
{
    // dd($request->all());
    Address::create($request->all());
    return back();
}

当我测试它时,数据库正在询问 isntitution_id 列:

SQLSTATE[HY000]:一般错误:1364 字段 'institution_id' 没有 有一个默认值(SQL:插入addressesaddress_nameaddress_number, address_full_name, address_city, address_state, address_postal_code, address_country, updated_at, created_at) 值 (a, a, a, a, a, a, a, 2017-12-14 2017-12-14 14:06:47 14:06:47))

那么,如何从表单中传递“institution_id”字段以及如何在控制器中获取它并关联到子记录?

我阅读了很多帖子,但在所有帖子中,它们只是创建一个包含一个字段的子记录,但我想处理包含所有地址字段的完整请求。

问候

【问题讨论】:

  • 您可以在 HTML 中的表单中使用“institution_id”隐藏字段,并将值设置为机构的值。希望您在访问此代码之前对谁可以创建地址进行访问控制
  • 只要确保你的 show.blade.php 视图中有 $institution 对象即可。
  • 谢谢@rypskar 我试过了,但它返回的字段为空
  • 感谢@robbyrr 对象在表单中,因为我列出了机构,但我无法在隐藏字段中获取 ID 值

标签: laravel laravel-5


【解决方案1】:

您可以像这样从store 方法的参数中访问id:

在路由文件中:

Route::post('/institution/{institution_id}/addresses', 'YourController@store')

在控制器中:

public function store($institution_id, Request $request)
{
    $request->request->add(['institution_id' => $institution_id]);
    // dd($request->all());
    Address::create($request->all());
    return back();
}

Ps : 不要忘记将institution_id 添加到地址模型的可填写字段中。

【讨论】:

  • 谢谢@maraboc,这行得通,但这是正确的方法吗?问候
  • 关于参数是的,这是推荐的方式,因为如果添加隐藏字段,您只会复制信息
  • 谢谢@Maraboc !!
【解决方案2】:

如果所有关系都已设置,则文档中包含您要查找的内容 https://laravel.com/docs/5.5/eloquent-relationships#the-create-method 示例:

// Routes (If laravel version > 5.2 web.php I guess
Route::post('/institution/{institution_id}/addresses', 'Controller@store')

// app/Http/Controllers/Controller.php
public function store(Request $request)
{
    $institution = Institution::find($request->institution_id);
    $address = $institution->addresses()->create($request->all());
    return back();
}
// app/Institution.php
class Institution extends Model
{
    public function addresses()
    {
        return $this->hasMany('App\Address', 'institution_id', 'id');
    }
}

【讨论】:

  • 感谢您的回复。我阅读了该文档,但总是给我以下错误:Call to a member function addresses() on null
  • 如我所说,如果您的模型设置了关系laravel.com/docs/5.5/eloquent-relationships#one-to-many
  • 是的,两者都有关系
  • 您是否按照我的回答更改了路线?
  • 是的,我也改了
【解决方案3】:

这就是我的做法。我有 2 个模型/控制器:网站和访问者。访问者依赖于网站。

路线:

Route::resource('website', 'WebsiteController');
Route::resource('website/{website}/visitor', 'VisitorController');

不要忘记设置所有关系。我只会在网站模型中向您展示我将用来保存数据的那个:

public function visitors()
{
    return $this->hasMany('App\Visitor');
}

然后,在 VisitorController 里面的 store:

public function store(Request $request, Website $website)
{
    return response()->json(
        $website->visitors()->create([
            ... fields without website_id (the relationship field) ...
        ]), 
        201
    );
}

【讨论】:

    【解决方案4】:
    $p=Parent::find($anId);
    $ch=Child::create(['somekey0'=>value0,'somekey1'=>value1,
    ...,'somekeyN'=>valueN]);
    $ch->my_parent()->associate($p);
    $ch->save();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多