Laravel有很多保存

时间:2018-08-26 12:13:13

标签: php database laravel dingo-api

我有两个表来保存数据。其中之一具有外键,因此我具有一对多关系。但是,我不明白如何将数据同时保存到两个表中。我有一个查询,其中包含一个表的数据和应附加到第一个表的数据。

那是主要型号

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);
    }

我知道它将保存为一条数据。我想请您帮我将数据分成两个表。在文档中,我找到了与数据库中现有模型建立关系的存储方式,但是在创建时我还没有该模型。

3 个答案:

答案 0 :(得分:0)

您必须确保某些事情。

首先:在您的SiteFeature模型中,似乎缺少与Site模型的逆关系。 应该有一个类似的功能:

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

为此,请参见Laravel 5.6 - Eloquent Relationships, One-to-Many

但是,如果您有一个关系,其中(n)个站点可以与(n)个SiteFeatures相关,则您的关系和逆关系必须不同。 (而且还必须有一个数据透视表,您可以在其中存储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保存到数据库中。

如果我误解了这个问题,请随时添加信息,我将进行更新。

答案 1 :(得分:0)

解决了

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);
    }

答案 2 :(得分:0)

这是使用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');
       }