【问题标题】:Foreign Key relationship in eloquent not working雄辩的外键关系不起作用
【发布时间】:2017-08-17 18:04:09
【问题描述】:

我已经研究过这个答案:Laravel Eloquent ORM relationship naming conventions

还有这个Query foreign key data from Blade template

但仍然无法解决我的问题。 我有两个模型:产品和类别,我想在我的刀片页面上显示产品数据及其类别 [name of course]。我知道可以通过将它添加到我的控制器中的返回数据来做到这一点,但是我想利用 Eloquent 来做到这一点,但是我收到了错误。

这是我的代码:

产品型号

protected $table = 'product_details';
public function category() {
    return $this->belongsTo('App\category', 'category_id');
}

类别模型

protected $table = 'category';
public function product() {
    return $this->hasMany('App\product');
}

产品控制器

public function index()
{
    $products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
    return view('admin/product/index', compact('products'));
}

索引刀片页面

{{ $product->category->category_name }}

表格

product_details

id
product_name
catgory_id

类别

id
category_name

我得到的错误:

试图获取非对象的属性

【问题讨论】:

  • 你能发布dd($product->category)的输出吗?我怀疑它是 null 可能是因为 category_id 为空或与类别表不匹配

标签: php mysql laravel eloquent blade


【解决方案1】:

可能你使用了错误的型号名称,默认情况下,型号名称是:

App\Foobar

类别的“C”字母大写

protected $table = 'product_details';
public function category() {
    return $this->belongsTo('App\Category', 'category_id');
}

产品的“P”字母大写

protected $table = 'category';
public function product() {
    return $this->hasMany('App\Product');
}

【讨论】:

    【解决方案2】:

    由于产品表中category_id 的值是null 或类别表中不存在的其他id 值,因此类别缺失。您可以通过以下方式检查刀片中的缺失值:

    {{ $product->category->category_name or 'Unknown Category' }}
    

    【讨论】:

      【解决方案3】:

      这就是我的看法。

      1. 您正在使用 get() 检索您的产品,该产品将返回一个数组,因此要访问类别集合,您必须遍历每个产品以检索它的类别。如果您只想要一个产品,可以使用 first()

      2. 我建议您使用预先加载来获取您的类别,以防止 n+1 查询问题。我认为在某种程度上它也有助于防止试图获取非对象的属性。查询现在将是

        $products = product::with('category')->select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
        
      3. 也可能是产品没有相关的类别记录,如果您强制执行外键约束,我认为这是不可能的。但如果是这种情况你可以试试 php7 ull Coalesce Operator。

        {{ $product->category->category_name ?? 'Not Available'}}
        

      【讨论】:

        【解决方案4】:

        在你的控制器中你写了:

        $products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
        

        但在你调用的刀片文件中:

        {{ $product->category->category_name }}
        

        您是否在刀片文件中编写了 foreach 循环?例如:

        @foreach ($products as $product)
            {{ $product->category->category_name }}
        @endforeach
        

        否则你应该调用 ->first 而不是 ->get 并更正你的错字。因此,您的 ProductController 上的代码将是:

        public function index()
        {
            $products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
            return view('admin/product/index', compact('products'));
        }
        

        虽然刀片页面上的代码是:

        {{ $product->category->category_name }}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-07
          • 2019-08-13
          • 1970-01-01
          • 2020-08-27
          • 1970-01-01
          • 1970-01-01
          • 2019-07-09
          相关资源
          最近更新 更多