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 收到的内容,因此您应该考虑以下内容:
- 验证您的输入。这将确保您不会将垃圾保存到数据库中
- 检查您是否已经有了要保存的数据集的某些部分,然后分两步保存:
第一步:
$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');
}
我有两个 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 收到的内容,因此您应该考虑以下内容:
- 验证您的输入。这将确保您不会将垃圾保存到数据库中
- 检查您是否已经有了要保存的数据集的某些部分,然后分两步保存:
第一步:
$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');
}