我是Laravel 4中的初学者,我在模型中定义的连接表中检索数据时遇到问题。我尝试按照Laravel的文档here和here中的说明进行操作。
这就是我所做的:我有一个模型(car.php)成功从我的汽车表中检索数据:
class Car extends Eloquent{
public function parts(){
return $this->hasMany('CarParts');
}
}
这是我的CarParts模型(car-parts.php):
class CarParts extends Eloquent{
protected $table = 'car_parts';
public function car(){
return $this->hasOne('Car');
}
}
我试过这些来获取连接表中的数据:
echo Car::find(1)->parts;
// also tried:
$cars = Car::find(1)->get();
echo $cars->parts;
但是我收到此错误消息:Undefined property:Car::$parts
答案 0 :(得分:1)
最好的方法是使用动态属性(->parts
),这样这对您有用:
$car = Car::find(1);
echo $car->parts;
或
$car = Car::find(1);
foreach($car->parts as $part)
{
echo $part->name;
}
parts()
方法为您提供了一个查询对象,可用于过滤您的部分内容:
$car = Car::find(1);
$parts = $car->parts()->where('model', '=', 'FORD')->get();
foreach($parts as $part)
{
echo $part->name;
}
此外,您可能需要将您的CarParts关系更改为:
$this->belongsTo('Car');
答案 1 :(得分:1)
你遇到的问题在于你们的关系。 hasMany()
的倒数是belongsTo()
所以考虑到这一点,你的模型应该看起来像这样......
class Car extends Eloquent
{
public function parts()
{
return $this->hasMany('CarParts');
}
}
class CarParts extends Eloquent
{
protected $table = 'car_parts';
public function car()
{
return $this->belongsTo('Car');
}
}
为了找到汽车的零件,你可以做这样的事情......
$parts = Car::find(1)->parts;
foreach($parts as $part) {
echo $part->name;
}
如果他们不遵循Laravel标准,您还应该将primaryKey属性添加到模型中。使用适当的密钥将其添加到CarPart
。
protected $primaryKey = 'car_part_id';
答案 2 :(得分:0)
首先,你的关系应该这样定义:
<?php
class Car extends Eloquent {
public function parts(){
return $this->hasMany('CarPart');
}
}
class CarPart extends Eloquent {
protected $table = 'car_parts';
public function car(){
return $this->belongsTo('Car');
}
}
你应该这样做:
Car::parts();
或者这个:
$cars = Car::find(1);
$carParts = $cars->parts();
答案 3 :(得分:0)
想出来......我将“CarParts”模型重命名为“Parts”。还将模型文件重命名为“parts.php”并且它有效。 (同样修正了edvinas.me注意到的关系......但这对结果似乎并不重要。)驼峰式的事情很奇怪。任何人都可以向我解释这个吗?这就是现在的样子:
class Car extends Eloquent{
public function parts(){
return $this->hasMany('Parts');
}
}
class Parts extends Eloquent{
protected $table = 'car_parts';
public function car(){
return $this->belongsTo('Car');
}
}
雄辩只是讨厌骆驼案吗?
<强>更新强>
我弄清楚为什么我在命名我的课程时遇到这个问题。事实证明,我的一个迁移类已经被称为CarParts。简单的问题,但我决定发布此更新,因为我认为其他人很容易犯同样的错误。