指定morphTo方法目标id列

时间:2017-05-21 15:58:16

标签: laravel eloquent laravel-eloquent

有没有办法在morphTo方法上指定目标id列?

我将举一个关于laravel文档的例子:

Post-Id,text

视频 - ID,网址

评论 - Id,text,commentable_id,commentable_type

但是,如果将帖子和视频上的ID重命名为custom_id怎么办?那我怎么设置我雄辩的模型呢?感谢。

修改

我仍然不明白这是完整的代码:

表格结构:

comments - id, text, commentable_id, commentable_type, user_id
posts - custom_id, text
videos - custom_id, url
users - id, name, email, password,...

评论模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}

视频模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Video extends Model
{

    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable', 'commentable_type', 'commentable_id', 'custom_id');
    }
}

发布模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable', 'commentable_type', 'commentable_id', 'custom_id');
    }
}

用户模型:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

的TestController:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class TestController extends Controller
{
    public function test()
    {
        $user = User::first();
        $comments = $user -> comments;

        foreach ($comments as $comment)
        {
            return $comment -> commentable;
        }
    }
}

它仍会抛出查询异常Unknown column posts.id

请解释一下。感谢。

1 个答案:

答案 0 :(得分:2)

您可以在关系中设置自定义ID字段名称。

public function comments()
{
    return $this->morphMany('App\Comment', 'commentable', 'commentable_type', 'commentable_id', 'custom_id');
}

有参数

public function morphMany($related, $name, $type = null, $id = null, $localKey = null);

编辑:经过整个事情后我发现使用自定义ID只能从父提取子关系。但是在尝试让父母使用孩子时失败了。因此,从评论中提取帖子或视频会失败。

有一个关于laravel内部的活跃提议,要添加该功能以允许指定自定义ID以使其工作。 https://github.com/laravel/internals/issues/587