当前位置: 首页 > 知识库问答 >
问题:

在一个模型中从两个相互关联的有说服力的模型中获取数据

阮疏珂
2023-03-14

目前,在其中一个项目中,我们使用了直接sql查询,并决定删除它们并实现ORM,因此我们决定为此使用Illumb-Elount模型组件。因为我们是新手,所以我对两个相互关联的模型之间的关系不太了解。

当前sql查询

select * from login as A, user_profile as B where A.user_id = B.login_id and A.user_id = $user_id

我创建了两个模型,一个是用户扩展照明\数据库\雄辩\模型,另一个是用户配置文件扩展照明\数据库\雄辩\模型。模型实现是这样的

用户模型

<?php
namespace App\Project;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'login';

    protected $primaryKey = 'user_id';

    public function profile()
    {           
        return $this->hasOne('App\Project\UserProfile', 'login_id');
    }   
}

用户配置文件模型

<?php
namespace App\Project;

use Illuminate\Database\Eloquent\Model;

class UserProfile extends Model
{
    protected $table = 'user_profile';

    protected $primaryKey = 'id';

    public function user()
    {   
        return $this->belongsTo('App\Project\User', 'user_id');
    }
}

我有一个类管理与一个方法getUserInfo它user_id作为输入

管理类

<?php
namespace App\Project;

class Manage
{
    public function getUserInfo($id)
    {
        return (new User())->profile()->where('login_id', $id)->get();      
    }
}

当我在应用程序中调用此方法时,我得到空集合

Illuminate\Database\Eloquent\Collection Object
(
    [items:protected] => Array
        (
        )
)

但如果我把它分成两段,像这样

$user = User::find($id);
$profile = $user->profile()->where('login_id', $id)->get();

$user变量中,我获取带有登录表数据的user模型的对象,在$profile变量中,我获取带有用户配置文件表数据的UserProfile模型的对象。现在我无法理解如何使用雄辩的模型在一次调用中得到两个表的结果。

共有3个答案

贺正祥
2023-03-14

好的,当使用时得到了答案,其中而不是查找能够得到单个记录。

$user = User::where('user_id', $id)->with('profile')->get();
祁增
2023-03-14

有两个选择:

如果要获得jointy查询结果,请尝试使用DB faces,如下所示:

$usersWithProfiles = \DB::table('users')
    ->distinct()
    ->join('profiles', 'profiles.user_id', '=', 'users.id')
    ->get();

这将为您提供每行用户及其配置文件的完整列表。

如果您想使用Eloquent,您可以简单地访问配置文件,如下所示:

$user->profile;

这将自动查询配置文件关系,因为您已在用户模型中定义了关系方法:profile()

澹台文博
2023-03-14

你可以这样做:

$user = User::find($id)->with('profile');

with子句中,您应该输入关系的名称。这将填充关系的对象

 类似资料:
  • 我在RSPEC中经常使用factory girl,但这个月我的任务是在测试套件中实现Cucumber故事。我想我可能有个不太确定的问题。 我们的“主”账户模型称为“公司”。用户、员工等属于此。有些直接通过f/k其他人通过委托。我们使用工厂女孩的旧方法设置了许多使用工厂女孩构建的模型实例变量。 i、 e in’spec\u助手。rb' 这在我看来相当愚蠢。 当我试图用“属性已定义:关联”的适当关联来

  • 我有一个关系N x 1,,post->user有如下关系: post.php(模型): 注意:我不希望在我的post.php模型文件中有任何“硬编码”的内容,因为在不同的情况下,我可能希望同一关系有不同的列,所以我希望将关系保留在上

  • 问题内容: 如何获得所有具有ForeignKey指向对象的模型对象的列表?(类似于DELETE CASCADE之前Django管理员中的删除确认页面)。 我试图提出一种合并数据库中重复对象的通用方法。基本上,我希望所有具有ForeignKeys指向对象“ B”的对象都被更新为指向对象“ A”,这样我就可以删除“ B”而不会丢失任何重要内容。 谢谢你的帮助! 问题答案: Django <= 1.7

  • 我的Laravel 5.2应用程序具有以下结构: 用户:id名称。。。 文章: id标题正文user_id(fk) 注释:id主体用户id(fk)发布id(fk) 我想创建几个用户(20个),为每个用户创建随机数量的帖子,并为每个帖子创建随机数量的评论(即使是固定数量也可以)。 我可以创建用户并为每个帖子分配帖子,但我不能为每个帖子分配评论:我有: 我发现了一些东西,但不起作用: 注意:我在模型之

  • 我的表格结构如下: 公司表(有许多货物,有许多包裹) 创建包条目时,我希望执行以下操作: 如果我在$shipping上转储die,那么它在那里有所有正确的ID,并且我希望这些关系会允许创建它。但是,创建包失败,因为没有order_id(orders表中的id)的值 我是否误解了雄辩在这里的作用? 编辑: 命令 装运 包裹 为了创建一个订单,我使用以下工作正常。 要创建我试图使用的货件和包裹: 然而

  • 通过预先确定好模型之间的关系,在业务开发中,使用非常简便的写法,就可以实现复杂的涉及多表数据增删改查。 这一切都是模型底层实现帮你在处理,在 imi 中,模型的关联关系都使用注解来定义。 注解 这里列出定义模型关联关系所需的注解,所有关联模型的注解,命名空间为Imi\Model\Annotation\Relation @OneToOne 一对一关系声明 用法: @OneToOne("模型类名")