Laravel Eloquent belongssto关系返回null

时间:2017-12-09 16:15:26

标签: php laravel laravel-5 eloquent

我有两个雄辩的模型:

1)发布

class Post extends Model
{
    protected $table = 'posts';
    protected $fillable = ['id', 'user_id', 'product_id', 'site_id', 'link_id', 'body', 'created_at', 'updated_at'];

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

    public function product(){
        return $this->belongsTo(Product::class);
    }

2)产品

protected $table = 'products';
protected $fillable = ['id', 'user_id', 'manufacturer_id', 'shift_product_id', 'name', 'english_name',
                        'slug', 'text', 'spec', 'live', 'created_at', 'updated_at'];

public function posts(){
    return $this->hasMany(Post::class);
}

我需要从帖子中获取产品 我这样做:

$posts = Post::get();

foreach($posts as $key){
    dd($key->product);
}

像这样返回NULL 如果我喜欢这样:  dd($key->product()); 我得到了产品,但我无法使用它 enter image description here

但我需要得到类似的东西来使用我需要的东西:

enter image description here

5 个答案:

答案 0 :(得分:1)

尝试指出关系中的foregin键和其他键,例如:

public function post()
{
    return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
}

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

更多:https://laravel.com/docs/5.5/eloquent-relationships

答案 1 :(得分:1)

数据库中可能不存在这种关系。

根据fillable上的Post数组,您遵循关键字的命名约定并且belongsTo关系方法具有正确的名称,因此关系设置的方式看起来正确约定。

$post->product()未返回您的Product模型。它返回Relation类型对象(BelongsTo)。这用于查询关系。 $post->product将是关系的动态属性,它将返回已加载的关系或加载关系并为您提供结果。

Laravel 5.5 Docs - Eloquent - Relationships - Relationship Methods Vs. Dynamic Properties

如果关系设置正确$post->productnull则意味着数据库中实际上不存在关系,idproducts没有匹配product_id }或product_id为空。 (假设没有外键约束)

旁注:急切加载这种关系是一个好主意:

$posts = Post::with('product')->get();

答案 2 :(得分:1)

我刚遇到这篇文章是因为在处理项目时遇到类似的错误。

我发现的是,当您使用all()方法查询模型时,它会忽略相关的软删除行。

当您尝试访问它们时,会得到空值

答案 3 :(得分:0)

我发现了我的问题 我没有ID = 1的DB产品 :/ 问题

谢谢你从我这里得到的所有帮助。

答案 4 :(得分:0)

记住在关联和解除关联后点击save()。有几次我了:

$model->relation()->associate($record)->save();