在多态关系laravel中为morphMany添加约束

时间:2016-07-27 09:44:37

标签: php laravel

我有一个Contact这样命名的模型:

class Contact extends Model
    {
        public    $timestamps = false;
        protected $primaryKey = 'contact_id';

        protected $fillable = [
            'tel', 'fax', 'email', 'mob', 'address'
        ];

        public function contactable ()
        {
            return $this->morphTo();
        }
    }

上面的模型可以属于某些其他模型,例如House这样命名的模型:

class House extends Model
    {
        protected $primaryKey = 'house_id';

        public function contact ()
        {
            return $this->morphMany('App\Contact', 'contactable');
        }

    } 

每个House只能有一个相关联系人但由于Contact模型可以与其他模型相关,我必须定义多态关系。

现在,当我想获得特定House模型的相关Contact模型时,返回一个Contact数组(只有一个元素),而我想将它作为一个简单的对象模型。例如:

public function edit (\App\House $house)
        {

            $house = $house->load('contact');

            return $house;

            return view('admin/pages/house/house-edit', compact('house'));
        }

结果如下:

{
    "house_id": 6,
    "title": "testا",
    "header": "0f74e9aa891bcc6fb84aa744721d9692.jpg",
    "type": "sara",
    "creator": 1,
    "created_at": "2016-07-26 15:19:31",
    "updated_at": "2016-07-26 15:19:31",

    "contact": [
        {
            "contact_id": 1,
            "tel": "1",
            "fax": "2",
            "email": "3",
            "mob": null,
            "contactable_id": 6,
            "contactable_type": "App\\House"
        }
    ]
}

我尝试在关系上使用first()方法:

public function contact ()
        {
            return $this->morphMany('App\Contact', 'contactable')->first();
        }

但是得到了这个错误:

  

调用未定义的方法   照亮\数据库\查询\生成器:: addEagerConstraints()

什么是解决方案?

3 个答案:

答案 0 :(得分:1)

我一直在检查是否有人可以给出答案,但由于没有人,我非常猜测这有可能有效:

public function contactRelation()
{
    return $this->morphMany('App\Contact', 'contactable');
}

public function contact()
{
    $this->load('contactRelation');

    return $this->contactRelation->first();
}

基本上我认为你不能在变形关系上调用 first()方法,所以也许你先修改变形然后尝试首先调用结果它可能有效

请注意,您的控制器中不再需要$house = $house->load('contact');,只需尝试访问以下关系:$house->contact();

答案 1 :(得分:1)

有一种解决方法,无需创建两个函数。

一个例子可能是:

// House.php
public function contact()
{

    return Contact

        ::where('contactable_id', $this->id)

        ->where('contactable_type', 'App\\House')

        ->first();

}

也许你必须改变一些名字。

希望这会有所帮助:)

修改

上述解决方案只能这样调用:

$house->contact()

如果您想使用正常的'方式($house->contact->first())你应该删除链末尾的->first()

答案 2 :(得分:0)

您可以使用 morphOne 关系

public function contact ()
{
    return $this->morphOne('App\Contact', 'contactable');
}