如何获取父表id并将其存储到其子laravel中

时间:2016-07-09 12:08:42

标签: laravel laravel-5

我已经搜索了很多找到更好的方法。我已经在Laravel docs上看了

  

Eloquent会尝试将子模型中的父ID与id匹配   在父模型上。

我有IdeaDocument个表格。他们有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();
    });
}

1 个答案:

答案 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();

}