Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 当使用关系名“BelongsTo”时,关系返回null;“用户”;_Laravel_Laravel 5_Eloquent_Phpunit_Laravel 5.5 - Fatal编程技术网

Laravel 当使用关系名“BelongsTo”时,关系返回null;“用户”;

Laravel 当使用关系名“BelongsTo”时,关系返回null;“用户”;,laravel,laravel-5,eloquent,phpunit,laravel-5.5,Laravel,Laravel 5,Eloquent,Phpunit,Laravel 5.5,在Laravel 5.5中创建简单的一对一关系时,$person->user在我使用方法/关系名user时返回一个null值。如果我将名称更改为foo、User或login,代码似乎工作正常。这是我第二个遇到同样问题的项目。有人能看出我做错了什么吗 亲身体验模式: public function user() { return $this->belongsTo(User::class, 'user_id', 'id'); } public function foo() {

在Laravel 5.5中创建简单的一对一关系时,
$person->user
在我使用方法/关系名
user
时返回一个
null
值。如果我将名称更改为
foo
User
login
,代码似乎工作正常。这是我第二个遇到同样问题的项目。有人能看出我做错了什么吗

亲身体验模式:

public function user() {
    return $this->belongsTo(User::class, 'user_id', 'id');
}
public function foo() {
    return $this->belongsTo(User::class, 'user_id', 'id');
}
public function getUser() {
    if ($this->user_id) {
        return User::find($this->user_id);
    } else {
        return null;
    }
}
在个人测试中:

$user = factory(User::class)->create();
$person = factory(Person::class)->create(['user_id' => $user->id]);

// This works                 
$this->assertTrue( $person->getUser()->is($user) );

// This works
$this->assertTrue( !is_null($person->foo) );
if ( $person->foo ) {
    $this->assertTrue( $person->foo->is($user) );
}

// This fails
$this->assertTrue( !is_null($person->user) );
if ( $person->user ) {
    $this->assertTrue( $person->user->is($user) );
}
根据要求,以下是与个人相关的所有代码, 整个App\Models\Person.php:

use App\Models\User;
use App\Models\Asset;
use App\Traits\HasGuid;
use App\Traits\HasNotes;
use App\Traits\HasModifiedBy;
use App\Traits\HasAttachments;
use App\Traits\HasRelationships;
use App\Transformers\PersonTransformer;
use App\Models\Abstracts\HasTypeModelAbstract;
use App\Models\Interfaces\HasTypeModelInterface;

class Person extends HasTypeModelAbstract implements HasTypeModelInterface {

    use HasModifiedBy,
        HasNotes,
        HasAttachments,
        HasRelationships;

    protected $fillable = [
        'person_type_id',
        'email',
        'fname',
        'lname',
        'user_id',
        'modified_by_user_id',
        'audited_at',
        'custom_attributes'
    ];
    protected $casts = [
        'custom_attributes' => 'json',
        'user_id' => 'integer',
        'modified_by_user_id' => 'integer',
        'person_type_id' => 'integer'
    ];
    protected $dates = [
        'audited_at'
    ];

    public static $transformer = PersonTransformer::class;

    public function user() {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function type() {
        return $this->belongsTo(PersonType::class, 'person_type_id');
    }

    public function assets() {
        return $this->hasMany(Asset::class, 'person_id');
    }
特点:

trait HasNotes {

    protected static function bootHasNotes() {
        static::deleting(function ($instance) {
            $instance->notes->each(function ($note) {
                $note->delete();
            });
        });
    }

    public function notes() {
        return $this->morphMany(Note::class, 'notable');
    }

}

trait HasModifiedBy {

    protected static function bootHasModifiedBy() {
        static::saving(function ($instance) {
            $instance->modified_by_user_id = Auth::id();
        });
    }

    public function modifiedBy() {
        return $this->belongsTo(User::class, 'modified_by_user_id');
    }

}

trait HasAttachments {

    protected static function bootHasAttachments() {

        static::deleting(function ($instance) {
            $instance->attachments->each(function ($attachment) {
                $attachment->delete();
            });
        });
    }

    public function attachments() {
        return $this->morphMany(Attachment::class, 'attachable');
    }

}

trait HasRelationships {

    protected static function bootHasRelationships()
    {
        static::deleting(function ($instance) {
            Relation::forObject( $instance )->delete();
        });
    }


    public function related() { ...[long polymorphic relationship here]... }
/应用程序/模型/摘要/HasTypeModelAbstract

use Illuminate\Database\Eloquent\Model;

// This thing just appends some custom attributes dynamically in the JSON and array forms. And no, 'user' is not a custom attribute key.

abstract class HasTypeModelAbstract extends Model {

public function newFromBuilder($attributes = array(), $connection = NULL) {
    $instance = parent::newFromBuilder($attributes);
    $instance->appendCustomAttributes();
    return $instance;
}

protected function appendCustomAttributes() {
    $this->append( $this->getCustomAttributesFromType() );
}

public function getCustomAttributesFromType() {
    if ($this->type) {
        return $this->type->custom_attributes ?
                array_keys((array) $this->type->custom_attributes) : [];
    } else {
        return [];
    }
}

protected function setCustomAttributesFromType($attributes = array()) {
    if ($this->type) {
        $custom_attribute_keys = $this->getCustomAttributesFromType();
        $custom_attributes = (array) $this->custom_attributes ?: [];
        foreach ($custom_attribute_keys as $key) {
            $attributes[$key] = array_get($custom_attributes, $key);
        }
    }
    return $attributes;
}

protected function addMutatedAttributesToArray(array $attributes, array $mutatedAttributes) {

    $this->appendCustomAttributes($this, $attributes);
    $attributes = $this->setCustomAttributesFromType($attributes);
    return parent::addMutatedAttributesToArray($attributes, $mutatedAttributes);
}

protected function mutateAttribute($key, $value)
{
    $keys = $this->getCustomAttributesFromType();
    if ( in_array($key, $keys) ) {
        return $this->getCustomAttributeValue( $key, $value );
    }
    return parent::mutateAttribute($key, $value);
}

protected function getCustomAttributeValue($key, $value) {
    $custom_attributes = (array) $this->custom_attributes ?: [];
    return array_get($custom_attributes, $key, $value);
}

用户是雄辩中的保留名称

尝试用户而不是用户

public function User() {
return $this->belongsTo(User::class, 'user_id', 'id');
}

我必须诚实-快速查看代码,我没有看到任何错误,但这并不意味着一切都是确定的好

如果我是你,我会尝试将人物模型限制为:

class Person extends \Illuminate\Database\Eloquent\Model {

    protected $fillable = [
        'person_type_id',
        'email',
        'fname',
        'lname',
        'user_id',
        'modified_by_user_id',
        'audited_at',
        'custom_attributes'
    ];
    protected $casts = [
        'custom_attributes' => 'json',
        'user_id' => 'integer',
        'modified_by_user_id' => 'integer',
        'person_type_id' => 'integer'
    ];
    protected $dates = [
        'audited_at'
    ];

    public static $transformer = PersonTransformer::class;

    public function user() {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function type() {
        return $this->belongsTo(PersonType::class, 'person_type_id');
    }

    public function assets() {
        return $this->hasMany(Asset::class, 'person_id');
    }

}
现在我要核实一切是否正常。如果可以的话,现在您可以进一步研究这个问题,添加一个特征并验证,添加第二个特征并验证,最后从同一个类扩展


一定有什么地方有bug,但看看这段代码,很难找到任何东西

我知道我可以更改方法名。我在上面提到,它与“用户”一起工作。您在何处发现“user”是雄辩中的保留名称?这不是模型上的属性。我找不到任何关于它的文档。我想看一个列表。您的个人模型或方法中是否有
user
getUserAttribute
?没有。我还检查了所有继承的特征,等等。你能用你使用的任何自定义特征包含整个文件吗?完成。请注意,“user”不是“HasTypeModelAbstract”类中的自定义属性键