我非常擅长使用Laravel,因此对Eloquent来说。我对Eloquent的桌子关系感到困惑。
现在我了解了如何实现简单连接,例如Laravel 4.2文档中的示例,该文档针对一对多关系,comment
属于一个post
但是post
可以有多个comments
。他们使用这种语法从一篇文章中获取评论:
Post::find(1)->comments;
在MySQL中,可能就像:
SELECT * FROM comments
JOIN posts ON posts.id=comments.post_id
WHERE posts.id=1
如果我试图获得的结果不仅仅是一行,那该怎么办?
SELECT * FROM comments
JOIN posts ON posts.id=comments.post_id
我知道根据我上面给出的例子它没有多大意义。但是我如何在Eloquent中做到这一点?
要提供更多详细信息,我实际上要做的是显示我的两个表assets
和asset_classifications
的联接结果。 asset
属于一个asset_classification
,asset_classification
有assets
个assets
。
我试图显示包含asset_classifications
的{{1}}的表格数据。在MySQL中,它是这样的:
SELECT * FROM assets
JOIN asset_classifications ON asset_classifications.id=assets.classification_id
我如何在Eloquent中执行它?
答案 0 :(得分:5)
我猜你对SQL有点过于依赖:)尝试在连接之外思考并在模型和melattionship中查询更多,因为Laravel会为你处理所有的抽象。
所以你有一个资产模型:
class Asset extends Eloquent
{
public function classification()
{
return $this->belongsTo('AssetClassification');
}
}
...和AssetClassification mdoel:
class AssetClassification extends Eloquent
{
public function assets()
{
return $this->hasMany('Asset');
}
}
现在他们已经联系在一起,你可以随心所欲。如果要输出所有资产及其分类,没问题:
$assets = Asset::all();
foreach($assets as $asset)
{
echo "{$asset->name}" is classified as {$asset->classification}";
}
或者相反:
$classifications = AssetClassification::all();
foreach($classifications as $classification)
{
echo "{$classification->name} has the following assets:";
foreach($classification->assets as $asset)
{ ... }
}
作为一个数组,这看起来像
[0] => [
'id' => 1
'name' => 'asset_name_1',
],
[1] => [
'id' => 2
'name' => 'asset_name_2',
],
你明白了。问题是,您对每次迭代执行单独的查询。这就是为什么你应该使用eager loading来加载所有资产以及它们的依赖关系:
$assets = Asset::with('classification')->get();
现在你有一个像这样的数组:
[0] => [
'id' => 1
'name' => 'asset_name_1',
'classification' => AssetClassiciation-Object
],
[1] => [
'id' => 2
'name' => 'asset_name_2',
'classification' => AssetClassiciation-Object
],
现在,您可以循环访问资产及其分类,而无需进行任何进一步的SQL查询。