laravel 4中的一对多关系帮助

Posted

技术标签:

【中文标题】laravel 4中的一对多关系帮助【英文标题】:one to many relationship help in laravel 4 【发布时间】:2014-04-08 19:16:12 【问题描述】:

我正在尝试在类别和产品之间创建关系,但不知何故我无法使用类别连接到产品表并打印出产品名称,而是获得了类别的名称

在我的数据库中

Table Name: products
Columns: id, name, price, category_id, description
Table Name: categories
Columns: id, name, description

在产品表中

id: 1
name: product1
price: 10
category_id: 1
description: p1
---------------
id: 2
name: product2
price: 10
category_id: 1
description: p2

在类别表中

id: 1
name: category1
description: c1
---------------
id: 2
name: category2
description: c2

models文件夹内的Product.php

class Product extends Eloquent

    protected $product = 'products';
    public function category()
    
        return $this->belongsTo('Category');
    

models文件夹中的Category.php

class Category extends Eloquent

    protected $category = 'categories';
    public function product()
    
        return $this->hasMany('Product', 'category_id');
    

控制器文件夹中的 ProfileController.php

class ProfileController extends BaseController

    public function user($username)
    
        $user = User::where('username', '=', $username);

        if ($user->count())
        
        $user = $user->first();
        $title = 'User Profile';
        $category = Category::find(1);
        $products = Category::find(1)->name;
        return View::make('profile.user', compact('user', 'title', 'category', 'products'));
    

    return 'User Not Found. Please Create an Account';

user.blade.php 在 profile 文件夹中,在 view 文件夹中

@extends('layouts.master')
@section('content')
     Auth::user()->username 
    <br>
     Auth::user()->email 
    <br>
    <h1> 'Category name: '. $category->name </h1>
    <br>
    <h3> 'Category Description: ', $category->description </h3>
    <br>
     $products 
@stop

一开始$products我用的是foreach循环

@foreach($products as $product)
    $product
@endforeach

然后我得到了这个错误

ErrorException
Invalid argument supplied for foreach() (View: J:\wamp\www\test\app\views\profile\user.blade.php)

所以我尝试了var_dump($products) 并意识到$products 给出了category1 这是类别的名称,但我想要打印所有具有 category_id 1 的产品的名称

有人可以帮我解决这个问题吗?是我搞砸了关系还是我对代码做了一些愚蠢的事情?

【问题讨论】:

您的类别是否可以包含多个产品,您的一个产品是否可以包含多个类别? 这部分对我来说没有意义:$category = Category::find(1); $products = Category::find(1)->name;不应该是 $products = $category->product; ?请在一对多关系上使用复数 btw(产品) kevin> 我以为我在需要的地方使用了复数,我错过了什么吗?请你指出来,以便我改变它。谢谢^_^ 您的产品关系基于 hasMany 设计。 $category->product 在一个类别很可能有多个产品的情况下没有意义,使用复数可以让以后更容易理解(所以 $category->products 在你的情况下) 【参考方案1】:

在您的控制器中:

$category = Category::find(1);
$products = $category->product;

然后在你的模板中你可以使用:

@foreach ($products as $product)
     $product->name 
@endforeach

更好的是,您可以使用预先加载而忘记手动分配产品:

控制器:

$category = Category::with('product')->where('id', 1)->first();

模板:

@foreach ($category->product as $product)
     $product->name 
@endforeach

PS:在此处阅读有关急切加载的更多信息:http://laravel.com/docs/eloquent#eager-loading 为了防止可怕的N + 1查询问题!

【讨论】:

感谢 kevin,我对 laravel 很陌生,我在 youtube 上观看关于人际关系的教程,这是使用 $post = Post::find(1); $comments = Post::find(1)-&gt;comment; 我相信我误解了视频 如果可能的话,你能告诉我$comments = Post::find(1)-&gt;comment; 中的comment 是什么意思吗?我以为comment 是专栏的名称,但似乎不是 我认为我应该坚持一种方法并在尝试其他方法之前更好地了解它,即使急切加载确实看起来更容易:P Laravel 易于学习,掌握起来有点困难,但在我看来完全值得深入研究。急切加载是一项功能,尤其是在大型数据驱动的应用程序中,在性能和可用性方面可以节省您的精力。您可能在教程中看到的 ->comment 与您的 Category::find(1)->product.. 它根据给定关系(belongsTo、hasOne 等)获取所有记录。跨度> 这两者都不是......它是您用于声明您的关系的方法的名称。例如,您有一个名为“products”的方法,它具有:return $this->hasMany('Product');。 Category::find(1)->products 表示根据您提供的关系,使用 'products' 方法查找属于此模型的所有产品。

以上是关于laravel 4中的一对多关系帮助的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Laravel 4 中检索一对多关系

无法删除一对多关系中的记录 laravel eloquent

Laravel 一对多关系结果

laravel eloquent 中的一对多关系

需要在 Laravel 4 的同一张表中设置一对多关系

Laravel 5.5中的一对多关系