使用 Eloquent Laravel 获取 hasMany 关系
Posted
技术标签:
【中文标题】使用 Eloquent Laravel 获取 hasMany 关系【英文标题】:Get hasMany relationship with Eloquent Laravel 【发布时间】:2014-10-29 14:12:40 【问题描述】:我有两个带有这个 schmea 的表:
mysql> show columns from table_1;
+-------------+------------------+------+-----+---------------------+-----------
| Field | Type | Null | Key | Default | Extra
+-------------+------------------+------+-----+---------------------+-----------
| id | int(10) unsigned | NO | PRI | NULL | auto_incre
| id_world | int(11) | NO | | NULL |
| key | varchar(255) | NO | | NULL |
| name | varchar(255) | NO | | NULL |
| description | varchar(255) | NO | | NULL |
| level | int(11) | NO | | 0 |
| created_at | timestamp | NO | | 0000-00-00 00:00:00 |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 |
+-------------+------------------+------+-----+---------------------+-----------
8 rows in set (0.00 sec)
和
mysql> show columns from table_2;
+--------------+------------------+------+-----+---------------------+----------
------+
| Field | Type | Null | Key | Default | Extra
|
+--------------+------------------+------+-----+---------------------+----------
| id | int(10) unsigned | NO | PRI | NULL | auto_incr
| key | varchar(255) | NO | | NULL |
| level | int(11) | NO | | NULL |
| name | varchar(255) | NO | | NULL |
| description | varchar(255) | NO | | NULL |
| price | int(11) | NO | | NULL |
| amount | int(11) | NO | | NULL |
| created_at | timestamp | NO | | 0000-00-00 00:00:00 |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 |
+--------------+------------------+------+-----+---------------------+----------
30 rows in set (0.00 sec)
我想获取所有字段“来自 table_2 where table_2.key = table_1.key AND table_2.level = 10”这是我模型中使用 hasMany 选项的正确方法吗?
我的正常查询如下所示:
SELECT A.key AS p_key,
A.name AS p_key,
A.description AS p_desc,
A.level AS p_level,
B.key AS r_key,
B.level AS r_level,
B.name AS r_name,
B.description AS r_desc
FROM
table_1 AS A,
table_2 AS B
WHERE
B.key = A.key AND
B.level = '1'
【问题讨论】:
将 Eloquent 关系与非唯一字段用作键可能/将导致意外行为。你不应该那样做。 【参考方案1】:要使用这些表建立hasMany
关系,您需要先创建两个模型,例如:
class TableOne extends Eloquent
protected $table = 'table_1';
public function tableTwoItems()
return $this->hasMany('TableTwo', 'table_2.key', 'table_1.key')
->where('table_2.level', 1);
class TableTwo extends Eloquent
protected $table = 'table_2';
一旦您在 app/models
目录中创建了这些模型,您就可以使用如下内容:
$result = TableOne::with('tableTwoItems')->get();
要选择项目/字段,您可以使用以下内容:
$result = TableOne::with(array('tableTwoItems' => function($query)
$query->select('table_2.key as k2', 'table_2.name as name2', 'more...');
))->select('table_1.key as k1', 'table_1.name as name1', 'more...')->get();
您可以像这样访问它们:
$result->first()->tableTwoItems->first();
或者您可以循环$result
,也可以使用嵌套循环循环相关项目。例如:
foreach($result as $tableOneItem)
echo $tableOneItem->name;
foreach($tableOneItem->tableTwoItems as $tabletwoItem)
echo $tabletwoItem->name;
endforeach;
endforeach;
尝试在两个表的key
中使用不同的字段名称,并使它们也唯一。阅读Eloquent Relation 文档了解更多信息。
【讨论】:
1 您不需要在hasMany
定义中使用前缀字段table_1.key
。 2你的第二个例子with()->select()
是错误的,记住表没有连接,所以会导致unknown column
错误。 3 您不需要为关系使用PK
,在这种情况下,它不是表的PK
,也不是唯一的 - 请参阅我对问题的评论。
谢谢队友@JarekTkaczyk_deczo_,我已经更新了答案,但我不确定我是怎么犯这个错误的:-)
我也没有,可能你只是需要一杯咖啡什么的;)
大声笑...嗯,实际上是凌晨 4:30,所以是的,你对咖啡的看法是对的 :-) @JarekTkaczyk_deczo_以上是关于使用 Eloquent Laravel 获取 hasMany 关系的主要内容,如果未能解决你的问题,请参考以下文章
使用 Eloquent Laravel 获取 hasMany 关系
Laravel 4.2 Eloquent 获取特定用户和特定角色
如何用 eloquent 在 Laravel 中只获取一个用户数据?