2017-08-03 86 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();' –