Заполните поле с помощью внешнего ключа в шаблоне создания с помощью Laravel 8

#php #laravel #laravel-8

Вопрос:

У меня есть 1 таблица: «Транзакции».
1 таблица «Сотрудник».

Я пытаюсь извлечь некоторую информацию из таблицы «Сотрудник» в контексте транзакций, чтобы заполнить выпадающее меню идентификатором «Сотрудник» (поскольку каждая транзакция должна быть связана с сотрудником). В это время, когда я запускаю свой код, я не получаю никаких результатов.

У меня есть внешний ключ «codigo_referido_id», который ссылается на «идентификатор» (из таблицы сотрудников).

Модель транзакции

 class Transaction extends Model
{
    use HasFactory;

    public function employees(){

       return $this->belongsTo(Employee::class , 'codigo_referido_id');

    }
}
 

Модель сотрудника

 class Employee extends Model
{
    use HasFactory;

    protected $table = 'employees';
    public $timestamps = true;

    protected $fillable = [
        'nombre',
        'codigo_referido'
    ];


}
 

Контроллер транзакций

     /**
     * Show the form for creating a new resource.
     *
     * @return IlluminateHttpResponse
     */
    public function create(Transaction $transaction)
    {
        $transactions = Transaction::all();
        

        return view('transaction.create' , compact('transactions'));
    }
 

Шаблон лезвия (на данный момент у меня есть только это, чтобы проверить результат):

 {{ dd($transactions->employees()) }}
 

Тем не менее, он заполнит Выбранное поле сотрудниками.

В это время я получаю эту ошибку:

Метод исключения Badmethod Call ОсвещаетБазу данныхКрасноречивуюколлекцию::сотрудников не существует.

Кто-нибудь может мне помочь?

С уважением

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

1. Вы неправильно вызываете метод с помощью . попробуйте это с помощью ->

2. изменить dd($transactions.empleados()) на dd($transactions->empleados())

3. Спасибо за ваш ответ, Мохаммад, изменив вызов метода, теперь он показывает следующее: Метод исключения badmethod ОсвещаетБазу данныхКрасноречивуюколлекцию::сотрудников не существует.

Ответ №1:

Transaction::all() возвращает коллекцию, даже если эта коллекция содержит только одну запись. employees() является методом на экземпляре Transaction , поэтому вам нужно будет перебирать коллекцию Transactions и вызывать employees метод на каждой итерации.

В качестве примера:

 @foreach ($transactions as $transaction)
    {{ dump($transaction->employees) }}
@endforeach
 

Обратите внимание, что если вы хотите получить фактическое employees значение, вам нужно вызвать связь без параметра () as, в противном случае вы получите экземпляр BelongsTo связи обратно.

Обновить

TransactionController.php

 public function create()
{
    return view('transactions.create', [
        'employees' => Employee::all()
    ]);
}

public function show(Transaction $transaction)
{
    return view('transactions.create', [
        'transaction' => $transaction->with('employees')
    ]);
}
 

транзакции.создайте

 {{-- loop over all employees --}
@foreach ($employees as $employee)
    {{ $employee->id }}
@endforeach
 

транзакции.показать

 {{-- get the employee associated to the transaction --}}
{{ $transaction->employees }}
 

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

1. Спасибо Peppermintology, теперь я знаю, что отношения работают, но я не получаю ожидаемых результатов, используя только что предоставленный вами код, он показывает всю строку первого «сотрудника «(поскольку в таблице есть только 1 запись транзакции, Если я вручную добавлю вторую запись в таблицу транзакций, она покажет две записи»Сотрудников». Есть ли какой-либо способ показать все записи сотрудников (так как я хочу, чтобы они заполняли поле выбора HTML).

2. Все сотрудники в вашей базе данных или только сотрудники, связанные с Transaction ?

3. Спасибо за разъяснение, Peppermintology, я уже сделал это, но, как я упоминал в своем предыдущем комментарии, я получаю только то же количество сотрудников, что и записи, которые у меня есть в базе данных, например: если у меня 10 записей о сотрудниках и только 2 записи транзакций, в ней будут отображаться только две записи о сотрудниках. Я хочу показать все записи сотрудников.

4. «Все сотрудники в вашей базе данных или только сотрудники, связанные с Транзакцией?» в транзакции.создайте представление, чтобы отобразить всех сотрудников. Затем, когда я создам транзакцию. показать представление, в нем будет отображаться только конкретный сотрудник, связанный с этой транзакцией.

5. @AlexandroGiles Я обновил свой ответ, чтобы ответить на ваши комментарии.

Ответ №2:

Вы передаете все транзакции в $transactions переменную. В вашем файле blade, который вы используете {{ dd($transactions->employees()) }} . Проблема в том, что функции связи модели должны выполняться на каждом экземпляре модели, а не на коллекции моделей. $transactions это коллекция Transaction mdoel. Используйте foreach цикл для их перебора:

 @foreach($transactions as $transaction)
    {{ $transaction->employee() }}
@endforeach
 

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

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

2. Я запутываюсь. если в каждой транзакции есть только один сотрудник, поэтому, если вы хотите показать всех сотрудников, просто используйте Employee::all()

3. да, это был ответ, который я неправильно понял, как извлекается информация, когда существует связь между двумя таблицами. Большое спасибо