混淆在这两个表的模型中使用哪种关系

Posted

技术标签:

【中文标题】混淆在这两个表的模型中使用哪种关系【英文标题】:confusion over which relationship to use in models for these two tables 【发布时间】:2015-09-26 13:45:50 【问题描述】:

我有一个包含以下列的用户表:

| id | username | password | email | pants_size_id | shirt_size_id |

pants_size_idshirt_size_id 充满了外国表格 id 键,我在其中存储了不同国家/地区特定措施中裤子和衬衫的尺寸列表,例如 pants_size 表格:

| id | UK_sizing | US_sizing | IT_sizing |

单个用户将只有一种裤子和衬衫尺码,因此用户表将填充尺码表中相应行的 ID。

这意味着用户模型与裤子和衬衫尺码模型之间存在什么样的关系?

当返回身份验证用户 return \Auth::user(); 而不是数字 size_id 时,如何检索外部​​表列中的数据(例如 IT_sizing)?

换句话说,我如何检索“32”(裤子尺寸)而不是pants_size_id(假设“1”)。

【问题讨论】:

非常确定您想在user 表中为pants_sizeshirt_size 建立hasOne 关系。然后像这样访问它:$user->pants_size->UK_sizing @CatoMinor 看起来像 OP 想要的。把它写成答案,这样他就可以接受;) 【参考方案1】:

Cato 有正确的答案,由于我的代表,我无法准确回答,但从关系的角度来看,您其他答案中的逻辑没有意义。

用户不属于大小,而是用户有大小。

在我看来,您将外键和本地键分配混为一谈,它应该是 User->hasOne(pants_size)。

在您的模型中,它会如下所示,键的明确性不是很好,但是如果您有一些奇怪的事情,laravel 无法弄清楚这应该起作用。

public function pants_size()
    return $this->hasOne('App\Pants_size','id','pants_size_id');



public function shirt_size()
    return $this->hasOne('App\Shirt_size','id','shirt_size_id');

要回答如何找到大小 (32) 的另一个问题,因为您要处理三种不同的测量值,所以您必须在 32 表示的特定测量值上有一个 where 子句,并获取 id。如果您特别想要用户,您可以这样调用 eloquent 查询:

\Auth::User()->pants_size()->(..whatever measurement you want..)

【讨论】:

我试过像你说的 return $this->hasOne('App\Pants_size','id','pants_size_id'); .. 不工作。实际上,从我的角度来看,用户可以属于某个尺寸。许多用户确实属于一个大小。示例 100 个用户属于pants_size 为 32 的用户组。 从您想要查询用户的方式来看,用户有一个大小而不是属于一个大小。如果您尝试查找所有 拥有pants_size 为 32 的用户,那么您已经解释了关系是 拥有。它返回什么错误,因为如果按照您的说明定义表,那么它应该可以工作。 请考虑pants_size 表没有user_id 列。它仅用作各种尺寸的容器,并且是有限的,例如 20 行。因此,根据文档,hasOne 关系会在pants_size 表中查找 user_id 列,但如果该表包含有关单个用户的许多数据(例如 100 个用户 100 个尺寸),这可能会起作用 但是你的模型设置是错误的。我给出的代码没有寻找 user_id,它的 pants_size_id 是本地键(用户表中的那个), id 是外键( pants_size) 表中的那个。大小与用户的反比关系是 belongsToMany。 我再次尝试并按照您的建议进行了修改。现在它正在工作。 sql 查询的区别是这样的:我的解决方案:"select * from 'users' where 'users'.'id' = ? - "select * from 'pants_size' where 'pants_size'.'id' = ? limit 1" 和你的:"select * from 'users' where 'users'.'id' = ? limit 1" - "select * from 'pants_size' where 'pants_size'.'id' = ? and 'pants_size'.'id' is not null limit 1" 所以后者只添加了一个检查以查看 id 是否不为空,但它怎么可能为空?注册时需要提供数据。【参考方案2】:

这就是我的工作方式:

在 USER 模型中:

   public function pants_size()
            return $this->belongsTo('App\Pants_size');

        

        public function shirt_size()
            return $this->belongsTo('App\Shirt_size');
        

在 Pants_size 和 Shirt_size 型号中:

public function user()

        return $this->hasMany('App\User');

    

最后一个也适用于 hasOne。

我用来检索数据的代码是:

public function index()
    

        echo $user = User::find($id);

        echo $pants = User::find($id)->pants_size->it_sizing;

        echo $shirt = User::find($id)->shirt_size->it_sizing;

    

【讨论】:

【参考方案3】:

user 模型中为pants_sizeshirt_size 创建function 关系。如果您不希望 Laravel 使用默认键 (see here for details),请务必正确设置 foreign keylocal key

创建functions 后,您将能够获取有关用户尺寸信息的数据,如下所示:App\Model\User::find(123)->pants_size->UK_sizing。 (此示例适用于 ID 为 123 的用户)。

【讨论】:

实际上它不起作用。此解决方案生成的 sql 是:SQL: select * from 'pants_size' where 'pants_size'.'user_id' = 1 and 'pants_size'.'user_id' is not null limit 1 但正如我解释的那样,pants_size 中没有任何 user_id 对于任何担心此答案可能错误的人,请参阅 Sieabah 提供的答案,确认它是正确的。

以上是关于混淆在这两个表的模型中使用哪种关系的主要内容,如果未能解决你的问题,请参考以下文章

如何创建混淆矩阵来评估模型?

从 Keras 模型中获取混淆矩阵

混淆矩阵 - 测试情绪分析模型

逻辑模型的混淆矩阵

使用“不存在”与空关系测试混淆

sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵可视化混淆矩阵(confusion matrix)