Laravel 有很多保存

Laravel hasMany save

我有两个 table 要保存数据。其中一个有外键,所以我有一对多的关系。但是,我不明白如何将数据同时保存到两个 table 中。我有一个查询,其中包含一个 table 的数据和另一个应该附加到第一个的数据。

这就是主力模型

class Site extends Model
{
    protected $fillable = ['path', 'site_link'];

    public $timestamps = false;

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

这是子模型

class SiteFeature extends Model
{
    protected $fillable = ['feature', 'site_id'];

    public $timestamps = false;
}

现在我的控制器看起来像这样

class SiteController extends BaseController
{
    public function index()
    {
        return Site::all();
    }

    public function show(Site $id)
    {
        return $this->response->item($id, new SiteTransformer);
    }

    public function store(Request $request)
    {
        $site = Site::create($request->all());

        return response()->json($site, 201);
    }

我知道它会把它保存为一个数据。我请你帮我把数据分成两个 tables。在文档中,我找到了在数据库中存储与现有模型的关系的方法,但是我在创建时没有那个模型。

有些事情您必须确定。

首先:在您的 SiteFeature-模型中,似乎缺少与 Site-模型的反比关系。 应该有一个像这样的函数:

public function site() 
{
    return $this->belongsTo('App\Site');
}

请参阅 Laravel 5.6 - Eloquent Relationships, One-to-Many

但是,如果您有 (n) 个站点可以与 (n) 个 SiteFeatures 相关的关系,则您的关系和反向关系必须不同。 (并且还必须有一个枢轴 table,您可以在其中存储 n 对 n 关系)

请参阅 Laravel 5.6 - Eloquent Relationships, Many-to-Many 在这种情况下。

由于您的问题没有描述通过 $request 收到的内容,因此您应该考虑以下内容:

  1. 验证您的输入。这将确保您不会将垃圾保存到数据库中
  2. 检查您是否已经有了要保存的数据集的某些部分,然后分两步保存:

第一步:

$site = Site::firstOrCreate(['path' => $request['input_name_for_path'],
                             'site_link' => $request['input_name_for_site_link'],
                           ]);

这将为您提供一个正确的 Site-模型保存到数据库中。 (请注意,这显示了如果您有不同的输入字段名称,您如何手动将值分配给模型中定义的可填写字段)

现在您可以继续保存连接到它的 SiteFeature-模型:

$feature = SiteFeature::firstOrCreate('feature' => $request['input_name_for_feature');
$site->features()->attach($feature->id);

这应该可以将新的(或旧的)Site 和相关的 SiteFeature 都保存到您的数据库中。

如果我误解了问题,请随时添加信息,我会更新。

这样解决了

public function store(Request $request)
    {
        $site = Site::create([
            "path" => $request->path,
            "site_link" => $request->link,
        ]);

        foreach ($request->features as $feature) {
            $site->features()->save(new SiteFeature(["feature" => $feature]));
        }

        return response()->json($site, 201);
    }

这是在不创建新的查找模型对象的情况下使用 hasMany 关系保存数据的正确方法。

       // inside controller
        public function store(Request $request)
        {
            $student = Student::create([
                "name" => $request->get('name'),
                "email" => $request->get('email'),
            ]);

            foreach ($request->subjects as $subject) {
                $student->subjects()->create(["title" => $subject['title']);
            }

            return response()->json($student, 201);
        }


      // inside User model
       public function subjects()
       {
          return $this->hasMany('App\Models\Subject');
       }