#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. да, это был ответ, который я неправильно понял, как извлекается информация, когда существует связь между двумя таблицами. Большое спасибо