指定 morphTo 方法目标 id 列

Specifying morphTo method target id column

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

我将举一个例子,它在 laravel 的文档中:

Post - ID, 文本

视频 - ID,url

评论 - Id,文本,commentable_id,commentable_type

但是,如果 post 上的 ID 和视频重命名为 custom_id 会怎么样?那我该如何设置我的 eloquent 模型呢?谢谢。

编辑:

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

Table结构:

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');
    }
}

Post 型号:

<?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');
    }
}

测试控制器:

<?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;
        }
    }
}

它仍然抛出查询异常未知列posts.id

请解释。谢谢。

您可以在关系中设置自定义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 只能从 parent 获取 child 关系。但是在尝试使用 children 获取 parent 时失败了。因此从评论中获取 Post 或视频会失败。

laravel 内部有一个积极的提议,以添加允许指定自定义 ID 的功能,以实现此目的。 https://github.com/laravel/internals/issues/587