Как получить идентификатор из таблицы отношений, Laravel

#php #laravel #eloquent #laravel-7 #eloquent-relationship

#php #laravel #красноречивый #laravel-7 #красноречивый-отношения

Вопрос:

У меня есть 4 таблицы: Users, CompanyRegister, VoucherDetails, Addvoucher. Таким образом, идентификатор пользователя для аутентификации будет отправлен как user_id в таблице companyRegister, а затем идентификатор companyRegister будет отправлен как company_id в таблице Voucherdetails, и, наконец, идентификатор voucherDetails будет отправлен в таблице addVoucher как voucher_ID. Я новичок в использовании eloquent, а также laravel, я не могу понять, почему я не могу получить идентификатор из voucherdetails и отправить в addvoucher, но я могу получить идентификатор из companyregister и отправить в company_id в voucherdetails. Я использую тот же метод для получения идентификатора, но не работаю, я надеюсь, что смогу получить решение и объяснение здесь, заранее благодарю вас!!

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

 public function companyregisters()
    {
         return $this->hasOne('Appcompanyregisters');
    }

public function voucherdetails()
{
     return $this->hasMany('Appvoucherdetails');
}

 public function addvoucher()
{
     return $this->hasMany('Appaddvoucher');
}

public function roles()
{
    return $this->belongsToMany('Approle');
}

public function hasAnyRoles($roles)
{
    if($this->roles()->whereIn('name', $roles)->first()){
        return true;
    }
    return false;
}

  public function hasRole($role)
{
    if($this->roles()->where('name', $role)->first()){
        return true;
    }
    return false;
}
  

моя модель регистрации компании

 public function User(){
         return $this->belongsTo('AppUser');
    }

public function voucherdetails()
{
     return $this->hasMany('Appvoucherdetails');
}
  

моя модель voucherdetails

   public function User(){
     return $this->belongsTo('User');
}


public function companyregisters(){
     return $this->belongsTo('Appcompanyregisters');
}

    public function addvoucher()
{
     return $this->hasOne('Appaddvoucher');
}
  

моя модель addvoucher

     public function User(){
     return $this->belongsTo('AppUser');
}

public function voucherdetails(){
     return $this->belongsTo('Appvoucherdetails');
}
  

мой voucherdetailsController

          public function store(Request $request){
    
    $voucherdetail = new voucherdetails();

    $voucherdetail->title = $request->input('title');
    $voucherdetail->description = $request->input('description');
    $voucherdetail->user_id = Auth::user()->id;

    $id = Auth::user()->id;
    $user      = User::find($id);
    $company   = $user->companyregisters;
    $companyId = $company->id;

    $voucherdetail->company_id = $companyId;

    $voucherdetail->save();
    
    return redirect()->to('addvoucher');
        
    }
  

мой addvoucherController

         public function store(Request $request){

    $addvoucher = new addvoucher();

    $addvoucher->voucherTitle = $request->input('voucherTitle');
    $addvoucher->voucherCode = $request->input('voucherCode');
    $addvoucher->user_id = Auth::user()->id;

//Here(the voucherdetails id cant get to submit in voucher_id)

    $id = Auth::user()->id;
    $user      = User::find($id);
    $voucher   = $user->voucherdetails;
    $voucherID = $voucher->id;

    $addvoucher->voucher_id = $voucherID;

    $addvoucher->save();
    
    return redirect()->to('displayVouchers');

}
  

Комментарии:

1. какая часть конкретно не работает, не могли бы вы добавить комментарий типа «// эта строка здесь, я не получаю правильное значение» или подобное?

2. Я отредактировал Sir

3. Я вижу, добавляя ответ сейчас

4. хорошо, сэр, я также получил эту ошибку, сэр, при использовании этого метода «Свойство [id] не существует в этом экземпляре коллекции».

5. Действительно, смотрите Ответ ниже, почему это происходит 🙂

Ответ №1:

Этот код работает, потому что companyregisters — это отношение hasOne, для которого в документах указано:

Как только связь определена, мы можем получить связанную запись, используя динамические свойства Eloquent.

 public function companyregisters()
{
   return $this->hasOne('Appcompanyregisters');
}

$company   = $user->companyregisters; // ie this returns the single related record 
$companyId = $company->id;            // and it has an `id` property, all good here
  

Однако этот код завершается с ошибкой, потому voucherdetails что это отношение hasMany, для которого в документах указано:

Как только связь определена, мы можем получить доступ к «коллекции» комментариев, обратившись к свойству comments .

Дополнительная информация о коллекциях

 public function voucherdetails()
{
     return $this->hasMany('Appvoucherdetails');
}


$voucher   = $user->voucherdetails; // ie this returns a "collection" of related records
$voucherID = $voucher->id;          // this "collection" does NOT have an id property, but each record IN the collection does.
  

В итоге, либо ваша связь определена неправильно (hasMany vs. hasOne), либо вам нужно будет перебирать связанные записи, чтобы получить идентификатор из каждой.

Комментарии:

1. сэр, но моя модель voucherdetails была hasOne, а не hasMany

2. Приведенное выше скопировано из вашего опубликованного кода. Возможно, вы хотели , чтобы это было hasOne , но вы сделали это hasMany , если это так, исправьте это, и все будет хорошо 🙂

3. Большое вам спасибо за ваше объяснение, сэр, это решило мою проблему, 🙂

4. Это была моя ошибка, вместо hasOne я поставил hasMany это y 🙁

5. @balamurugana Потрясающе, рад помочь.