2017-08-07 14 views
0

どういうわけか、私の外部キーを保存しようとすると、私のlaravelの関係は機能しません。Laravelの外部キーがnull

クライアント移行

Schema::create('clients', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->string('name'); 
    $table->string('email')->unique(); 
    $table->string('password'); 
    $table->rememberToken(); 
    $table->timestamps(); 
}); 

問い合わせ移行

Schema::create('inquiries', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->unsignedInteger('client_id')->nullable(); 
    $table->unsignedInteger('device_id')->nullable(); 
    $table->string('android_device_token')->default(''); 
    $table->integer('status')->default(0); 
    $table->timestamps(); 
    $table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade'); 
    $table->foreign('device_id')->references('id')->on('devices')->onDelete('cascade'); 
}); 

要求を入れて、このようにそれを保存しようとしますが、データベースは私ヌル

$data = array(
    "device_id" => $request->input('device_id'), 
    "client_id" => Client::find($request->input('client_id'))->id, 
    "android_device_token" => $inquiry->android_device_token, 
    "status" => $request->input('status') 
); 
$inquiry->fill($data); 
$inquiry->save(); 

モデルの関係を示す続けます:

お問い合わせ:

public function client() 
{ 
    return $this->hasOne(Client::class); 
} 

クライアント:照会モデルはbelongsToの関係を持っている必要があり

protected $table = 'inquiries'; 
protected $fillable = ['client_id', 'device_id', 'android_device_token', 'status']; 

public function inquiry() 
{ 
    return $this->hasMany(Inquiry::class); 
} 
+0

はあなたが私たちに 'Inquiry'のためのモデルを示していることはできますか? –

+0

あなたの '$ inquiry'には何がありますか? – PaladiN

+0

@ArigiWiratama ok私はそれらを上に追加しました – junikear

答えて

1

オーケー、私は問題があなたのモデルとコントローラでの問題を知っています。ここで

は私のコードは次のとおりです。

Client.php

public function inquiries() { 
    // if the relation is one to many 
    return $this->hasMany(Inquiry::class); 

    // if th relation is one to one 
    return $this->hasOne(Inquiry::class); 
} 

Inquiry.php

public function client() { 
    // It should use belongsTo 
    return $this->belongsTo(Client::class); 
} 

そして、あなたのコントローラでは、次のようになります。

コントローラ

$client = Client::find($request->input('client_id')); 
$inquiry = new Inquiry; 
$data = array(
    "device_id" => $request->input('device_id'), 
    "android_device_token" => $inquiry->android_device_token, 
    "status" => $request->input('status') 
); 
$inquiry->fill($data); 
$inquiry->client()->associate($client); // set the foreign key 
$inquiry->save(); // save the inquiry 

編集:それはフィル法によって引き起こされる場合 。私はあなたがこれにそれを変更する必要があり、あなたのコントローラで考える:

// Get the client 
$client = Client::find($request->input('client_id')); 

// Initiate the Inquiry model; 
$inquiry = new Inquiry; 
$inquiry->device_id = $request->input('device_id'); 
$inquiry->android_device_token = $inquiry->android_device_token; 
$inquiry->status = $request->input('status'); 
$inquiry->client()->associate($client); 
$inquiry->save(); 

が、それはあなたを助けることを願って:D

+0

sryがうまくいきません – junikear

+0

未定義のメソッドを呼び出す – junikear

+0

ああ、申し訳ありません、私は悪いです。私の編集を見てください –

0

問い合わせモデルの関係:

public function client() 
{ 
    return $this->belongsTo(Client::class); 
} 

クライアントモデルの関係:

public function inquiries() 
{ 
    return $this->hasMany(Inquiry::class); 
} 

また、あなたは、お問い合わせを節約するために関係にsaveメソッドを使用することもできます。

$client = Client::find($request->input('client_id')); 

$inquiry = new Inquiry(); 
$inquiry->fill(array(
    "device_id" => $request->input('device_id'), 
    "android_device_token" => $inquiry->android_device_token, 
    "status" => $request->input('status') 
)); 
$client->inquiries()->save($inquiry); 
+0

sryがうまくいきません – junikear