在使用 Laravel 8 创建模板时使用外键填充字段
Posted
技术标签:
【中文标题】在使用 Laravel 8 创建模板时使用外键填充字段【英文标题】:Populate a field using a foreign key on create template using Laravel 8 【发布时间】:2021-09-16 10:49:48 【问题描述】:我有 1 个表:“交易”。 1 个“员工”表。
我正在尝试从 Transactions 上下文中的表“Employee”中检索一些信息,以便使用“Employee”中的 id 填充下拉菜单(因为每个事务都需要链接到 Employee)。此时,当我运行我的代码时,我没有得到任何结果。
我有一个引用“id”的外键“codigo_referido_id”(来自 Employee 表)。
交易模型
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 \Illuminate\Http\Response
*/
public function create(Transaction $transaction)
$transactions = Transaction::all();
return view('transaction.create' , compact('transactions'));
刀片模板(目前我只有这个来检查结果):
dd($transactions->employees())
不过,它会用员工填充 Select 字段。
此时我收到此错误:
BadMethodCallException 方法 Illuminate\Database\Eloquent\Collection::employees 不存在。
有人可以帮我吗?
问候
【问题讨论】:
您没有使用 .试试 -> 将dd($transactions.empleados())
更改为 dd($transactions->empleados())
感谢您的回复 Mohammad,更改方法调用现在显示:BadMethodCallException Method Illuminate\Database\Eloquent\Collection::employees 不存在。
【参考方案1】:
Transaction::all()
返回一个集合,即使该集合仅包含一条记录。 employees()
是 Transaction
实例上的一个方法,因此您需要遍历 Transactions
的集合并在每次迭代时调用 employees
方法。
举个例子:
@foreach ($transactions as $transaction)
dump($transaction->employees)
@endforeach
请注意,如果您想要实际的employees
,则需要调用不带()
的关系,否则您将获得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')
]);
transactions.create
-- loop over all employees --
@foreach ($employees as $employee)
$employee->id
@endforeach
transactions.show
-- get the employee associated to the transaction --
$transaction->employees
【讨论】:
谢谢 Peppermintology,现在我知道关系正常,但我没有收到预期的结果,使用您刚刚提供的代码它显示了第一个“员工”的整行(因为有表上只有一条交易记录如果我手动向交易表添加第二条记录,它将显示“员工”的两条记录。有没有办法显示所有员工记录(因为我希望他们填充 html 选择字段) . 您数据库中的所有员工,或者只是与Transaction
相关的员工?
感谢 Peppermintology 的澄清,我已经这样做了,但正如我在之前的评论中提到的,我收到的员工数量与我在 DB 上的记录相同,例如:如果我有 10 条员工记录,只有 2 条交易记录,它只会显示两条员工记录。我想显示所有员工记录。
"您数据库中的所有员工,还是仅与交易相关的员工?"在 transaction.create 视图中显示所有员工。然后当我创建 transaction.show 视图时,它只会显示与该事务关联的特定员工。
@AlexandroGiles 我已经更新了我的答案来解决你的 cmets。【参考方案2】:
您将所有交易传递给$transactions
变量。在您的刀片文件中,您使用的是 dd($transactions->employees())
。问题是模型关系函数应该在模型的每个实例而不是模型集合上运行。 $transactions
是 Transaction
mdoel 的集合。使用foreach
循环遍历它们:
@foreach($transactions as $transaction)
$transaction->employee()
@endforeach
【讨论】:
Mohammad,我觉得建模不错:1 笔交易必须属于 1 名员工。尽管如此,我认为我不了解如何将所有员工检索到 transaction.create 视图,以便在创建新事务时将其用作约束。我希望所有员工都填充下拉菜单,以强制用户在创建新交易时选择员工。 我很困惑。如果每笔交易只有一名员工,那么如果您想显示所有员工,只需使用Employee::all()
是的,这就是我误解了当两个表之间存在关系时如何检索信息的答案。非常感谢以上是关于在使用 Laravel 8 创建模板时使用外键填充字段的主要内容,如果未能解决你的问题,请参考以下文章
LARAVEL 8:一般错误:使用外键运行迁移时发生 1005