私のアプリには、「ユーザー」と「医学タイプ」という2つのモデルがあります(各ユーザーは1つのMedicineTypeに属します)。
BelongsTo()とhasMany()を使用して、2つのモデル間に1対多の関係を作成しました。 hasMany()リレーションは完全に機能しますが、belongTo()は機能しません。誰が私がどこで間違いを犯したか知っていますか?
User :: find(1)-> medicine_type [これは何も返しません]
MedicineType :: find(1)-> users [これはユーザーを返します]
モデルのコードは次のとおりです。
class MedicineType extends Eloquent {
public function users()
{
return $this->hasMany('User');
}
}
class User extends Eloquent {
public function medicine_type()
{
return $this->belongsTo('MedicineType');
}
}
そして、ここに私のデータベース構造があります:
users:
id
name
medicine_type_id
medicine_types:
id
name
リレーションが機能しない理由は、モデルで指定されたリレーションによるものではなく、ユーザーモデルでのメソッドの命名と外部キーの指定がないためです。
の代わりに:
public function medicine_type()
{
return $this->belongsTo('MedicineType');
}
つかいます:
public function medicineType()
{
return $this->belongsTo('MedicineType', 'id');
}
私はこれがあなたのために働くことを望みます;)
すべて一緒に:
<?php // app/models/MedicineType.php
class MedicineType extends Eloquent {
// Determines which database table to use
protected $table = 'medicine_types';
public function users()
{
return $this->hasMany('User');
}
}
そして:
<?php // app/models/User.php
class User extends Eloquent {
// Determines which database table to use
protected $table = 'users';
public function medicineType()
{
return $this->belongsTo('MedicineType', 'id');
}
}
動作するかどうかのテスト:
$user = User::find(1);
return $user->medicineType->name;
これにより、関連するmedicine_typeの名前が正常に返されます。
これがあなたの助けになることを願っています;)
Eloquentが外部キーを見つけるのに問題があるのかもしれません。これを試して:
class User extends Eloquent {
public function medicine_type()
{
return $this->belongsTo('MedicineType', 'medicine_type_id');
}
}
編集:
また、Eloquentは「medecine_types」ではなく「medicinetypes」テーブルを検索しようとするため、$table
変数を使用して同様に指定する必要があります。
class MedicineType extends Eloquent {
protected $table = 'medicine_types';
public function users()
{
return $this->hasMany('User');
}
}
関係メソッドに「戻り値」を追加しないという愚かな間違いをしました!
関係を返すことを確認してください...明らかにこれはnot動作します:
public function medicineType()
{
$this->belongsTo('MedicineType', 'id');
}
「medicine_type」を「medicineType」に変更すると、すべてが正常になりました...
ほとんどの場合、投票されたナンバーワンの回答がベストアンサーかもしれません。ただし、関連する関係の読み込みに問題があり、運がない場合は..
動作する可能性のある他のことが1つあります。モデルの各テーブルとそのインデックスまたは外部キーを見てください。私の場合、テーブル名は変更しましたが、関連するインデックスと外部キーは更新しませんでした。
溶液。
A:(Feeling Lazy)関連付けられたインデックスまたは外部キーを削除するだけです。
B :(私はレイジーではありません)laravel=移行を介してテーブルを削除し、適切な外部キーを使用して職人の移行を再実行します。
私の場合、関連モデルのデータが削除されました&laravel一般的なクエリでソフト削除されたデータを取得しない。ソフト削除されたデータを取得するには、「withTrashed()or onlyTrashed()」 。
ここでドキュメントを確認できます。