在Eloquent中使用联接

时间:2014-03-10 19:15:32

标签: php mysql laravel eloquent

我是Laravel 4中的初学者,我在模型中定义的连接表中检索数据时遇到问题。我尝试按照Laravel的文档herehere中的说明进行操作。

这就是我所做的:我有一个模型(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

4 个答案:

答案 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。简单的问题,但我决定发布此更新,因为我认为其他人很容易犯同样的错误。