laravel morphTo如何使用自定义列?

时间:2017-02-13 03:54:45

标签: php laravel

我有三张这样的表

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一样, 在这里,我想使用自定义列

我不知道该怎么办。

2 个答案:

答案 0 :(得分:0)

出于惯例目的,您可能希望将owner_code替换为owner_id表格中的business

在商业模式中,您就像那样做。

public function owner() {
    return $this->morphTo();
}

companypersonal模型中,您可以添加

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作为表的值:businessowner_typebusiness (请参见问题erd示例)您拥有company作为值的位置。

解决方案:

从Laravel 5.1及更高版本开始,请按一下here

  

自定义多态类型

     

默认情况下,Laravel将使用完全限定的类名称进行存储   相关模型的类型。例如,上面的例子   其中Comment可能属于PostVideo,默认   commentable_type分别为App\PostApp\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 |
|----|---------|-----------|-------------|------|
|    |         |           |             |      |
|    |         |           |             |      |
|    |         |           |             |      |