【问题标题】:Can this block of code of mine can be improved我的这个代码块可以改进吗
【发布时间】:2021-11-23 06:57:24
【问题描述】:

[这是从两个表中填充数据,其中一个表具有来自同一列的两个外键作为另一表上的引用]

https://i.stack.imgur.com/D8fiv.png

[这是我的外键表的架构]

https://i.stack.imgur.com/eYDL0.png

这是用 laravel 写的,它正在工作,但是我有一种发痒的感觉,这是错误的

【问题讨论】:

  • 嗯,首先你应该在问题正文中包含代码。使用三个反引号开始(和结束)代码块。其次,这里唯一看起来错误的是您使用的是连接而不是雄辩的关系,并且您的 family_compositions 表看起来像一个数据透视表而不是一个实体本身。阅读更多in the docs,了解如何与中间(数据透视)表中的其他列定义多对多关系
  • use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。

标签: laravel join foreign-keys relationship


【解决方案1】:

正如其他人评论的那样,您应该将代码放在您的问题中。可能还需要更多上下文,因为不清楚您要从 view() 返回什么。您是返回 $citizen、$family 还是两者都返回?包含您正在使用的 Laravel 版本也会很有帮助。我假设你使用的是最新的 Laravel 8。

您的代码应该可以工作,但如果您不利用 Laravel 的关系,您将自己做更多的工作。如果这样做,您的代码中的所有查询内容都可以缩减为几行代码,如下所示:

public function view(Citizen $citizen)
{
    $citizen->load('family');
    return $citizen;
}

数据库迁移

您可以使用 foreignId() 来缩短迁移时间。有关详细信息,请参阅文档

https://laravel.com/docs/8.x/migrations#foreign-key-constraints

之前:

$table->integer('client_id')->unsigned(); 
$table->foreign('client_id')->references('id')->on('citizens');

之后:

$table->foreignId('client_id')->constrained();

路由模型绑定

我假设您的 view() 方法在您的控制器中,并且是从路由调用的。由于需要的一个参数是客户端的 id,因此您可以使用路由模型绑定并跳过从数据库中获取客户端。

https://laravel.com/docs/8.x/routing#route-model-binding

public function view(Citizen $citizen)
{
    // your code
}

关系

您似乎已经建立了关系,但您没有使用它们来加载数据。您应该能够加载相关对象而无需任何手动查询。

如果您在 Citizen 模型和 Family 模型上具有 belongsTo(One to Many) 关系,您可以像这样加载它:

$citizen->load('family');

或者像这样使用它

$relationship = $citizen->family->relationship;

我不知道您的模型之间的关系是什么,但您应该阅读文档中的不同关系类型。

https://laravel.com/docs/8.x/eloquent-relationships

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多