web-dev-qa-db-ja.com

Laravel belongsTo動作しません

私のアプリには、「ユーザー」と「医学タイプ」という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
23
Yashari

リレーションが機能しない理由は、モデルで指定されたリレーションによるものではなく、ユーザーモデルでのメソッドの命名と外部キーの指定がないためです。

の代わりに:

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の名前が正常に返されます。

これがあなたの助けになることを願っています;)

43
Melvin Koopmans

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');
    }
}
9
Joseph

関係メソッドに「戻り値」を追加しないという愚かな間違いをしました!

関係を返すことを確認してください...明らかにこれはnot動作します:

public function medicineType() 
   {
      $this->belongsTo('MedicineType', 'id');
   }
3
HPage

「medicine_type」を「medicineType」に変更すると、すべてが正常になりました...

1
Yashari

ほとんどの場合、投票されたナンバーワンの回答がベストアンサーかもしれません。ただし、関連する関係の読み込みに問題があり、運がない場合は..

動作する可能性のある他のことが1つあります。モデルの各テーブルとそのインデックスまたは外部キーを見てください。私の場合、テーブル名は変更しましたが、関連するインデックスと外部キーは更新しませんでした。

溶液。

A:(Feeling Lazy)関連付けられたインデックスまたは外部キーを削除するだけです。

B :(私はレイジーではありません)laravel=移行を介してテーブルを削除し、適切な外部キーを使用して職人の移行を再実行します。

0

私の場合、関連モデルのデータが削除されました&laravel一般的なクエリでソフト削除されたデータを取得しない。ソフト削除されたデータを取得するには、「withTrashed()or onlyTrashed()」 。

ここでドキュメントを確認できます。

https://laravel.com/docs/5.6/scout#soft-deleting

0
sh6210