我有三张这样的表
Country.findAll({
where: {},
include: [mode: City, require: true],
offset: 0,
limit: 10
});
模特公司:
business:
|--id--|--owner_code--|--owner_type--|
|---1--|--WSWJDIXSWS--|---company----|
|---2--|--ADSOOEKL23--|---personal---|
company:
|--id--|-----code-----|----name---|
|---1--|--WSWJDIXSWS--|----ibm----|
|---2--|--SDFSDFSDFS--|----h3c----|
presonal:
|--id--|-----code-----|-----name----|
|---1--|--ADSOOEKL23--|-----jack----|
|---2--|--SDFSDFSDFS--|----brown----|
模特个人:
class Company extends Model
{
public function business() {
return $this->morphMany('App\Models\Business', 'owner');
}
}
模特业务:
class Personal extends Model
{
public function business() {
return $this->morphMany('App\Models\Business', 'owner');
}
}
的IndexController:
class Business extends Model
{
public function owner(){
return $this->morphTo();
}
}
视图:index.blade
class IndexController extends Controller
{
public function index(){
//DB::connection()->enableQueryLog();
//$queries = DB::getQueryLog();
$businesses = Business::get();
$businesses->load('owner');
return view('index')->with(compact('businesses'));
}
}
当我运行应用程序时,所有名称都是“未找到”
这里我使用debuger 我发现查询是:
<table bgcolor="#7fffd4" width="400">
<tr>
<td colspan="3" bgcolor="#f5f5dc" align="center">BUSINESS</td>
</tr>
<tr>
<td bgcolor="#f0f8ff">ID</td>
<td bgcolor="#f0f8ff">OWNER_TYPE</td>
<td bgcolor="#f0f8ff">NAME</td>
</tr>
@foreach($businesses as $business)
<tr>
<td bgcolor="#f0f8ff">{{$business->id}}</td>
<td bgcolor="#f0f8ff">{{$business->owner_type}}</td>
<td bgcolor="#f0f8ff">{{object_get($business->owner, 'name', 'unfind')}}</td>
</tr>
@endforeach
</table>
在laravel文档中,列就像owner_type owner_id一样,
在这里,我想使用自定义列
我不知道该怎么办。
答案 0 :(得分:0)
出于惯例目的,您可能希望将owner_code
替换为owner_id
表格中的business
。
在商业模式中,您就像那样做。
public function owner() {
return $this->morphTo();
}
在company
和personal
模型中,您可以添加
public function business() {
return $this->morphMany('App\Business', 'owner');
}
然后你可以做
$busines = Business::first();
$busines->owner->name //should echo 'ibm'
<强>更新强>
要在变形关系中定义外键,请执行
public function business() {
return $this->morphMany('App\Models\Business', 'owner', 'business', 'owner_code');
//Model, name, table, foreign key
}
morphToMany()
的功能定义如下:
public function morphToMany($related, $name, $table = null, $foreignKey = null, $otherKey = null, $inverse = false){}
答案 1 :(得分:0)
现在可能不需要这个问题的答案,但仍在发布以帮助像我这样的新手。我遇到以下情况。
Laravel希望将App\Company
作为表的值:business
列owner_type
表business
(请参见问题erd示例)您拥有company
作为值的位置。
从Laravel 5.1及更高版本开始,请按一下here
自定义多态类型
默认情况下,Laravel将使用完全限定的类名称进行存储 相关模型的类型。例如,上面的例子 其中
Comment
可能属于Post
或Video
,默认commentable_type
分别为App\Post
或App\Video
。 但是,您可能希望将数据库与 应用程序的内部结构。在这种情况下,您可以定义一个 关系“变形图” 来指示Eloquent使用自定义名称 每个模型而不是类名称:use Illuminate\Database\Eloquent\Relations\Relation; Relation::morphMap([ 'posts' => 'App\Post', 'videos' => 'App\Video', ]);
您可以在morphMap
的启动功能中注册AppServiceProvider
,也可以根据需要创建单独的服务提供商。
我的文件如下:
namespace App\Models;
class Post extends Model
{
public function likes()
{
return $this->morphMany('App\Models\Like', 'entity');
}
}
class Comment extends Model
{
public function likes()
{
return $this->morphMany('App\Models\Like', 'entity');
}
}
class Like extends Model
{
/*Polymorphing Model/Table*/
public function entity()
{
return $this->morphTo();
}
}
// In app/Providers/AppServiceProvider.php
/*Below line added*/
use Illuminate\Database\Eloquent\Relations\Relation;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
/*Below line added*/
Relation::morphMap([
'post' => 'App\Models\Post',
'comment' => 'App\Models\Comment',
]);
}
}
我的桌子like
| id | user_id | entity_id | entity_type | type |
|----|---------|-----------|-------------|------|
| | | | | |
| | | | | |
| | | | | |