我已经搜索了很多找到更好的方法。我已经在Laravel docs上看了
Eloquent会尝试将子模型中的父ID与id匹配 在父模型上。
我有Idea
和Document
个表格。他们有1:M的关系。 Idea
可以包含多个文档,文档只能与一个Idea
相关联。
我无法获取要存储的父表ID。
控制器功能:
public function storeDocuments(DocumentRequest $request) {
if($request->hasFile('doc_name')) {
$filename = $request->file('doc_name')->getClientOriginalName();
$moveFile = $request->file('doc_name')->move('documents/', $filename);
}
$doc = new Document();
$doc->doc_name = $moveFile;
$doc->save();
}
文档模型:
public function idea() {
return $this->belongsTo('App\Idea');
}
理念模型:
public function documents() {
return $this->hasMany('App\Document');
}
请解释将父表的id存储到子表中的过程。谢谢!
修改
public function storeDocuments(DocumentRequest $request) {
if($request->hasFile('doc_name')) {
$filename = $request->file('doc_name')->getClientOriginalName();
$moveFile = $request->file('doc_name')->move('documents/', $filename);
}
$doc = new Document();
$doc->doc_name = $moveFile;
$idea = Idea::find(1); //how to get idea_id here???????
$idea->documents()->save($doc);
return back();
}
我对这种关系非常困惑。现在正在努力,无法弄清楚。
理念架构:
public function up()
{
//
Schema::create('ideas', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('idea_title');
$table->string('idea_info', 150);
$table->string('idea_image');
$table->string('selection');
$table->longText('idea_description');
$table->string('idea_location');
$table->integer('idea_goal')->unsigned();
$table->integer('pledge_amount')->unsigned();
$table->string('set_equity')->nullable();
$table->boolean('status')->default(0);
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
}
文档架构:
public function up()
{
//
Schema::create('documents', function (Blueprint $table) {
$table->increments('id');
$table->integer('idea_id')->unsigned();
$table->string('doc_name');
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
}
答案 0 :(得分:0)
您无需手动设置ID,Eloquent会为您执行此操作:
documents()
返回一个关系,该关系具有存储相关模型的save方法:
$idea->documents()->save($document);
它甚至有一个saveMany()
方法可以同时存储多个:
$idea->documents()->saveMany($documents);
<强>更新强>
您应该将它放到您的存储库类中。假设foreign_key是idea_id,但是有一秒 传递给hasMany方法的ond参数,如果已经构建了模式,则可以覆盖它:
public function documents() {
$this->hasMany("\App\Document", "your_foreign_key_here");
}
相关的laravel文档为here。
希望有所帮助。
<强>更新强>
$idea_id = $idea->id; // assuming the ID field is not overriden in your schema/model
它只是使用了想法表的主键值,与find方法中使用的值相同。一对多关系通过默认连接工作,并使用父主键值连接子表记录。
IDEA DOCUMENT
----------- ---------------
| id |-->| idea_id | id |
| 1 | | 1 | 1 |
| 2 | | 1 | 2 |
----------- ----------------
好的,所以在SQL中重现查询。基本上每个模型代表一个表,表中的每个记录代表该模型类的一个实例。要查询它们,您需要在该表上有一个主键字段,因此每个记录都由该字段标识。它在eloquent中默认为'id'。
当我们谈论关系时,我们需要另一个字段来加入相关表。在这种特殊情况下,它将是文档表中的idea_id字段。当获取与ID为1的想法相关联的文档时,相关文档在其“idea_id”字段中将具有1,因为它们与id = 1的想法相关联。 SQL查询看起来像sg:
SELECT * FROM document JOIN idea ON document.idea_id = idea.id WHERE idea.id = 1
但正如我已经说过的那样,你不必明确地存储那个值,因为雄辩就是这样。
您能告诉我您的文档和创意表或迁移模式吗?
<强>更新强>
public function storeDocuments(DocumentRequest $ request){
if($request->hasFile('doc_name')) {
$filename = $request->file('doc_name')->getClientOriginalName();
$moveFile = $request->file('doc_name')->move('documents/', $filename);
}
$doc = new Document();
$doc->doc_name = $moveFile;
$idea = Idea::find(1); // idea id is 1, but i guess it'll come from the route or sg like that in a real world scenario
$idea_id = $idea->id; // the idea id : in this case = 1
$idea->documents()->save($doc);
return back();
}