升级的Laravel应用程序中的多态关系从4.2到5

时间:2015-03-27 15:19:55

标签: laravel-4 eloquent laravel-5 polymorphic-associations relationships

简短:一些相关模型正确地返回实例,但有些不是(多态的)。

我有这三种模式:

应用/型号/ user.php的

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function company()
    {
        return $this->hasOne('App\Company');
    }
}

应用/型号/ Company.php

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Company extends Model {

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function address()
    {
        // Also tested with morphMany, without success
        return $this->morphOne('App\Address', 'addressable');
    }

}

应用/型号/ Address.php

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Address extends Model {

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

}

控制器:

应用程序/ HTTP /控制器/ MyController.php

<?php namespace App\Http\Controllers;

// ... many "use" clauses not relevant to the question
use Auth;
// ...

use App\Address;
use App\Company;
use App\User;

class MyController extends Controller {

    // Ok here
    $user = Auth::user();

    // Ok here, too
    $company    = $user->company()->first();

    // Here is the problem; $address is null
    $address    = $company->address()->first();

}

$company->address()->first();总是在Laravel 5中将null返回到$address,但在Laravel 4.2中效果很好

3 个答案:

答案 0 :(得分:1)

如果您打开数据库,则会将旧L4数据中的关系显示为:UserCompany

您需要运行一个脚本,将列更新为新的命名空间名称 - 例如App\UserApp\Company

这是因为您现在正在命名模型 - 因此Laravel需要知道要调用哪个命名空间。

答案 1 :(得分:1)

除了@The Shift Exchange的回答并按照我的问题示例,您可以关注this approach

您可以使用addressable_typeaddress table $morphClass列值中添加命名空间(这是一个有效的解决方案) p>

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Company extends Model {

    protected $morphClass = 'Company';

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function address()
    {
        // Also tested with morphMany, without success
        return $this->morphOne('App\Address', 'addressable');
    }

答案 2 :(得分:1)

在L4模型中,默认情况下没有命名空间,因此它们在表格中保存为ModelName,而现在在L5中它们相当Namespace\ModelName并以相同的方式检索。

也就是说,您在L4中保存的数据需要进行调整,以便与当前模型匹配,或者您可以在模型上使用protected $morphClass

然而,对于后一种解决方案,请考虑this