指定 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
有没有办法在 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