我有两个表来保存数据。其中之一具有外键,因此我具有一对多关系。但是,我不明白如何将数据同时保存到两个表中。我有一个查询,其中包含一个表的数据和应附加到第一个表的数据。
那是主要型号
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);
}
我知道它将保存为一条数据。我想请您帮我将数据分成两个表。在文档中,我找到了与数据库中现有模型建立关系的存储方式,但是在创建时我还没有该模型。
答案 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收到的内容,因此您应该考虑以下内容:
第一步:
$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');
}