【发布时间】:2020-04-01 13:08:39
【问题描述】:
在我的 Laravel 项目中,我有两个 Eloquent 模型 Set 和 Card,它们之间有一对多的关系。 Set 有很多 Cards 和 Cards 属于 Set。
我正在尝试使用 with() 函数使用 Eloquent Eager Loading 提取数据。但由于某种原因,sets 中的 cards 数组返回为空白 []。
Set.php
<?php
namespace App;
use App\Card;
use Illuminate\Database\Eloquent\Model;
class Set extends Model
{
protected $table = "sets";
public function cards() {
return $this->hasMany('App\Card');
}
}
Card.php
<?php
namespace App;
use App\Set;
use Illuminate\Database\Eloquent\Model;
class Card extends Model
{
protected $table = "cards";
public function sets() {
return $this->belongsTo('App\Set');
}
}
控制器代码
$sets = Set::with([
'cards' => function($query){
$query->select('name', 'description');
},
])->get();
return $sets;
name 和description 是我在Cards 表中的字段,除了主键和外键。
它在sets 的JSON 数组中返回"cards": []。
我尝试在控制器中使用以下代码,
$sets = Set::with('cards.*')->get();
return $sets;
没用。
尝试在我的 Set 模型中的 hasMany 方法中添加外键(set_id 位于 Cards 表中),该模型与 Cards 表创建关系。但没有结果。
需要提及的是,当我尝试从CardController 中分别提取Cards 表中的数据时,它返回了所有Cards 数据。
一些线索将意味着很大的帮助。感谢您的宝贵时间。
【问题讨论】:
-
in tinker 取出卡片并检查 $card->sets 返回什么?
-
异常消息“此集合实例上不存在属性 [sets]。” .这就是我得到的
-
^ 这个错误对你发布的代码没有任何意义;你不会在任何地方打电话给
->sets。请发布您的完整代码。此外,如果您遇到该错误,请确保您正在循环您的Collection。您不能调用$cards->sets(如果$cards是Collection),但$card->sets(其中$card是单个Card实例)非常好。最后,您的关系名称应该代表返回的内容。belongsTo返回1个Set模型,或者null,所以称它为sets(复数)是错误的,应该是set。 -
把它转错了 Set::all()->first()->cards ?
-
你能多说一点吗? @mrhn