有没有办法在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
请解释一下。感谢。
答案 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