【问题标题】:Foreach with data from two tables laravel使用来自两个表 laravel 的数据进行 Foreach
【发布时间】:2015-03-14 09:40:40
【问题描述】:

我目前正在构建一个项目/学习 laravel。

我有两个数据库,两个表中的一个列具有相同的唯一值。

在我的刀片页面中,我有一个循环遍历第一个表的 foreach,但我无法弄清楚如何让它正确地携带第二个表数据等。

这里是代码。

我的餐厅模特。

class Restaurant extends Eloquent implements UserInterface, RemindableInterface {

use UserTrait, RemindableTrait;

protected $table = 'restaurants';

public function reviews()
{
    return $this->hasMany('restaurant_id');
}

评论模型

class Review extends Eloquent implements UserInterface, RemindableInterface {

use UserTrait, RemindableTrait;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'reviews';


public $review;

public function reviews()
{
    return $this->hasMany('restaurant_id');
}

刀片foreach循环

 @foreach(array_slice($restaurants, 0, 5) as $restaurants)

{{$restaurant[0]->restaurant_id}}}

{{$reviews= Review::find(1)->where('restaurant_id', '=', $restaurant[0]->restaurant_id)->get()}}

@emdforeach

控制器很好地传递数据,所以不排除它。

我正在尝试让相关评论与餐厅对象等一起传递。

有什么想法吗?

如果您看到任何拼写错误的借口,因为我不得不在笔记本电脑和台式机上重新输入代码是好的 :)

更新

非常感谢您的帮助,经过您的解释我明白了,所以谢谢:)

当我尝试它时,我得到尝试获取非对象的属性。

这是更新的代码

餐厅模型

class Restaurant extends Eloquent implements UserInterface,     RemindableInterface {

use UserTrait, RemindableTrait;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'restaurants';


public $restaurant;



public function reviews() 
 {
return $this->hasOne('Review', 'restaurant_id', );
}

在我看来

v {{ dd($restaurants->reviews) }}

这让我尝试获取非对象的属性。

$restaurants 完美地工作,只是没有评论?我可以 dd 并查看数组中的 5 个对象

【问题讨论】:

    标签: php laravel-4


    【解决方案1】:

    如果您有 $restaurant 的实例,您可以像这样获取它的评论集合:

    $reviews = $restaurant->reviews;
    

    由于这是一个多对多关系,它返回一个集合,您现在也可以@foreach 覆盖这个集合:

    @foreach(array_slice($restaurants, 0, 5) as $restaurants)
    
        {{ $restaurant[0]->restaurant_id }}
    
        @foreach($restaurant->reviews as $review)
            {{ $review->rating }}
        @endforeach
    
    @endforeach
    

    reviews 属性存在于餐厅模型中,因为您定义了此方法:

    public function reviews()
    {
        return $this->hasMany('restaurant_id');
    }
    

    以这种方式访问​​相关属性类似于documentation 中给出的第一个示例。如果您想查看源代码并了解发生了什么,here 是在您访问未在类中专门定义的模型属性时调用的函数(即不是$fillable$guarded,而是任何数据属性、访问的关系(如属性等)。

    如果您有一个 Chef 模型和一个餐厅可能有很多厨师的数据库结构,并且您在餐厅模型中定义了此方法:

    public function chefs() 
    {
        return $this->hasMany('Chef');
    }
    

    然后,您可以像这样获得餐厅所有厨师的列表:

    $chefs = $restaurant->chefs;
    

    您也可以直接调用该方法,例如,如果您想为查询添加更多限制:

    $chefsNamedBob = $restaurant->chefs()->where('name', '=', 'Bob')->get();
    

    请注意,当以这种方式调用时,您还必须调用->get()->first(),这在尝试通过实例的属性而不是作为实例的方法访问关系时是不同的。这是因为当您调用该方法时,查询尚未执行(这就是get() 所做的)。当您将关系作为属性访问时,当您收到结果时,查询已经执行(这意味着 SQL 没有更多时间为您进行过滤)。

    更新

    我还注意到你的关系有问题。你定义你的餐厅来审查这样的关系:

    return $this->hasMany('restaurant_id');
    

    hasMany 函数的第一个参数不是列名。一般来说,关系函数的函数签名是这样的:

    return $this->hasOne('ModelClassName', 'foreign_key', 'local_key');
    

    请参阅documentation 了解更多信息。如果您遵循雄辩的约定(复数表名,id 作为主键,外键名是正确的),那么您可以使用快捷方式并只需指定模型类名称:

    return $this->belongsToMany('ModelClassName');
    

    这是遵循惯例的一个很好的理由。

    【讨论】:

    • 非常感谢您的帮助,经过您的解释我明白了,非常感谢:)
    • 对此有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多