简短:一些相关模型正确地返回实例,但有些不是(多态的)。
我有这三种模式:
应用/型号/ 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中效果很好
答案 0 :(得分:1)
如果您打开数据库,则会将旧L4数据中的关系显示为:User
或Company
您需要运行一个脚本,将列更新为新的命名空间名称 - 例如App\User
或App\Company
这是因为您现在正在命名模型 - 因此Laravel需要知道要调用哪个命名空间。
答案 1 :(得分:1)
除了@The Shift Exchange的回答并按照我的问题示例,您可以关注this approach:
您可以使用addressable_type
:而不是在address
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。