在使用 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()) 。问题是模型关系函数应该在模型的每个实例而不是模型集合上运行。 $transactionsTransaction mdoel 的集合。使用foreach 循环遍历它们:

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

【讨论】:

Mohammad,我觉得建模不错:1 笔交易必须属于 1 名员工。尽管如此,我认为我不了解如何将所有员工检索到 transaction.create 视图,以便在创建新事务时将其用作约束。我希望所有员工都填充下拉菜单,以强制用户在创建新交易时选择员工。 我很困惑。如果每笔交易只有一名员工,那么如果您想显示所有员工,只需使用Employee::all() 是的,这就是我误解了当两个表之间存在关系时如何检索信息的答案。非常感谢

以上是关于在使用 Laravel 8 创建模板时使用外键填充字段的主要内容,如果未能解决你的问题,请参考以下文章

LARAVEL 8:一般错误:使用外键运行迁移时发生 1005

Laravel 8 - 用户表中的两个外键

无法使用 laravel 数据库迁移创建外键

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8

外键代码在 Laravel 8 的迁移中不起作用

如何在 Laravel 中定义和使用外键作为主键?