Свойство [users] не существует в этом экземпляре коллекции - PullRequest
1 голос
/ 30 января 2020

Эта ошибка была опубликована здесь несколько раз, но я столкнулся с чем-то немного другим. У меня есть две таблицы с именами users и user_type. И users использует внешний ключ от user_type. Мне нужно выбрать всех пользователей и их типы, я использую Eloquent ORM Laravel для определения отношений, это отношение один к одному.

Модель пользователей :

/**
 * Get the user type that user has.
 */
public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

Модель UserType :

/**
 * The primary key associated with the table.
 *
 * @var string
 */
protected $primaryKey = 'ut_id';

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasOne('App\Models\Users', 'user_type_id', $this->primaryKey);
}

Контроллер извлечения :

$users = Users::all()->users;

Согласно Laravel ORM один к одному Я могу получить доступ к этому методу как к свойству, но он показывает мне определенную ошибку. Я также пытался получить доступ к нему как к методу, но он говорит:

Метод Illuminate \ Database \ Eloquent \ Collection :: users не существует.

I ' Мы также пытались получить их по join(), но возвращаются только несколько пользователей, я не знаю почему:

$users = Users::where('id', '>', '0')
        ->join('user_type', 'user_type.ut_id', '=', 'users.id')
        ->select([
            'user_type.ut_name',
            'users.*'
        ])->get();

Может кто-нибудь сказать мне, что я делаю неправильно?

Ps : Я просто хочу показать всем пользователям их типы

Ответы [ 3 ]

1 голос
/ 30 января 2020

Вы пропустили точный внешний ключ между таблицей пользователей и таблицей типов пользователей.

Во-первых, вы определили, что внешний ключ вашей пользовательской таблицы является базой ut_id того, что у вас было в ваших отношениях. На этом

/**
 * Get the user type that user has.
 */
public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

Во-вторых, в вашей модели типа пользователя вы использовали внешний ключ к таблице пользователя с именем 'user_type_id', который вначале вы назвали его как 'ut_id' в вашей таблице пользователей , На этом

/**
 * The primary key associated with the table.
 *
 * @var string
 */
protected $primaryKey = 'ut_id';

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasOne('App\Models\Users', 'user_type_id', $primaryKey);
}

Вы должны сопоставить эти внешние ключи, которые вы использовали для решения вашей проблемы.

Теперь, чтобы получить всех ваших пользователей с их типами, ваш запрос должен выглядеть следующим образом.

$users = Users::with('users')->get();

при условии, что ваша пользовательская таблица имеет эти отношения

public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

, а ваша модель типов пользователей имеет эти отношенияhio

public function users(){
    return $this->hasOne('App\Models\Users', 'ut_id', $this->primaryKey);
}
0 голосов
/ 30 января 2020

Ваши отношения кажутся неправильными.

Пользователи ссылаются на UserType с id на ut_id, но userType ссылается на User с id на user_type_id

Я почти уверен, что так и должно быть для userTypes

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasMany('App\Models\Users', 'id', 'user_type_id');
}

, а затем для пользователей

public function userTypes(){
    return $this->belongsTo('App\Models\UserType', 'user_type_id', 'id');
}

Тогда вы можете загружать все нужные результаты ...

$users = Users::where('id', '>', '0')
        ->with('userTypes')
        ->get();
0 голосов
/ 30 января 2020

в пользовательской модели

public function type(){
   return $this->hasOne(UserType::class, 'id');
}

в пользовательской модели

public function users(){
  return $this->belongsToMany(User::class, 'id');
}
...