混淆在这两个表的模型中使用哪种关系
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_id
和 shirt_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_size
和shirt_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_size
和shirt_size
创建function
关系。如果您不希望 Laravel 使用默认键 (see here for details),请务必正确设置 foreign key
和 local 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 提供的答案,确认它是正确的。以上是关于混淆在这两个表的模型中使用哪种关系的主要内容,如果未能解决你的问题,请参考以下文章
sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵可视化混淆矩阵(confusion matrix)