2017-08-03 88 views
1

我想使用Laravel上的关系访问控制器功能中的数据。使用关系访问数据Laravel

我将首先解释我的代码:

我有3个表,项目,客户端和client_project。

在这一刻,client_project没有任何关系,我只是手动添加它。

现在我想使用laravel上的关系,但它有点令人困惑(至少对我而言)。

我认为这不是太重要的项目和客户端的代码表,只需要像主键的id和一些字段更多。

我client_project迁移看起来像在这里:

<?php 

use Illuminate\Database\Migrations\Migration; 
use Illuminate\Database\Schema\Blueprint; 

class CreateClientProjectTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('client_project', function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->integer('client_id'); 
      $table->integer('project_id'); 
      $table->timestamps(); 
     }); 
    } 


    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('client_project'); 
    } 

} 

Client_Project模型看起来像在这里:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Client_Project extends Model 
{ 
protected $fillable = ['client_id','project_id']; 

public $table = 'client_project'; 


    public function clients() 
    { 
     return $this->hasMany('App\Models\Project'); 
    } 
    public function projects() 
    { 
     return $this->hasOne('App\Models\Client'); 
    } 

} 

一个客户可以有多个项目,但一个项目只能由一个客户端创建。我认为关系是好的。 (起初,我认为与关系,我不需要做client_project表),但我认为这是一个错误的想法。我也想用这张桌子做。

所以,现在,当我尝试的功能控制器上调用它的问题,我想我可以进入使用POR示例数据:

App\Models\Project::find(1),像laravel的医生说。

的功能是这样的:

$client = new Client(); 
$client->name = $request->input("nameClient"); 
$client->slug = $request->input("slugClient"); 
$client->priority = $request->input("priorityClient"); 
$client->save(); 

$client_project = new Client_Project(); 
$client_project->client_id = App\Models\Client::max('id'); 
$client_project->project_id = App\Models\Projects::max('id'); 
$client_project->save(); 

客户端的一部分,是工作。我只是把一些投入的价值和我创造一个新的。

问题出在$ client_project。我想让它变得动态。我创建了客户端和项目,并且我的代码获得了最后一个(更大的ID)以及项目的最后一个(更大的ID)。 我如何使用关系访问它们? 可能需要编辑client_project的迁移并在project_id或client_id中放置一些密钥?

如果需要更多信息,请询问。 任何帮助将不胜感激!

+0

你是过于复杂的事情,你不需要client_project表(此类型的表在很多用于许多realtionships),你只要NEDD CLIENT_ID列在您的项目表,使维吾尔betveen客户端Ant项目。但是,如果你也想要第三张表,那就把它变成许多到很多的实用性(你不需要ClientProject模型,你在客户和项目模型中建立多对多的关系)。 –

+0

您可以使用$ client-> id获取上次插入的客户端ID。用这种方法,如果你有多个用户在同一时间插入,那么它就会变成假值。 –

+0

@Autista_z你能回答一下我的代码必须看起来如何?我想我只会用两张表来完成,并为各个ID添加1个字段。 –

回答

0

这是你的答案。您将以良好的方式为客户端和项目创建数据透视表,以便您可以将任意多个项目附加到任何客户端。这是与模型的关系。

客户端模型

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Client extends Model 
{ 
    public function projects() { 
     return $this->belongsToMany(Project::class,'client_project'); 
    } 
} 

项目模型

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Projects extends Model 
{ 



    public function client() { 
     return $this->belongsToMany(Client::class,'client_project'); 
    } 


} 

?> 

对于保存项目ID使用下面的控制器方法

$client = new Client(); 
    $client->name = $request->input("nameClient"); 
    $client->slug = $request->input("slugClient"); 
    $client->priority = $request->input("priorityClient"); 
    $client->save(); 
    $project = new Project(); 
//include fields as per your table 

    $project->save(); 

    $client->projects()->attach($project->id); 

方式。

+0

嗨@Shashikant Chautan我不能用2张桌子做,前端代码是为3张桌子设计的,我无法触摸它。模型看起来像现在一样,当我发布的答案,但我想获得控制器中的id值。在控制器中,我必须创建新的Client_Project。我如何看待价值观? –

+0

看看它已经在使用三张表看代码了。您将创建不需要的数据透视表模型。 –

+0

是的,对不起。那么,我能做到吗? '$ client_project = new Client_Project(); $ client_project-> client_id = $ client-> projects() - > attach($ project-> id); $ client_project-> save();' –