Laravel很多到很多关系使用雄辩 [英] Laravel many to many relationship using Eloquent

查看:177
本文介绍了Laravel很多到很多关系使用雄辩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这是我当前的表格模型:



相册

  album_id 
name
created_at

user_image

  user_image_id 

albumxuser_image(结表)




album_id(来自专辑的FK)
user_image_id(来自user_image的FK)

我想要能够从albumxuser_image表获取相册名称。



这是我迄今为止所做的。



Album.php模型

 命名空间App \Models; 

使用Illuminate\Database\Eloquent\Model;


类相册扩展模型{

/ **
*模型使用的数据库表。
*
* @var string
* /
protected $ table ='album';
protected $ primaryKey ='album_id';

public function AlbumxUserImage(){
return $ this-> belongsToMany('AlbumxUserImage','albumxuser_image','album_id','user_image_id');
}
}

routes.php(我没有使用视图我正在练习)

  Route :: get('all',function(){
$ albumxuserimage = AlbumxUserImage :: all();
foreach($ albumxuserimage-> AlbumxUserImage as $ getthem){
echo $ getthem-> pivot-> name; //我想获取名称列的相册表。
}
});

AlbumxUserImage.php

 命名空间App \Models; 

使用Illuminate\Database\Eloquent\Model;


class AlbumxUserImage extends Model {

protected $ table ='albumxuser_image';
protected $ primaryKey ='albumxuser_image_id';

/ **
*质量可分配的属性。
*
* @var数组
* /
protected $ fillable = ['album_id','user_image_id'];
}

这是我得到的错误

 调用未定义的方法Illuminate\Database\Eloquent\Collection :: AlbumxUserImage()


解决方案

您正试图在 AlbumxUserImage()



AlbumxUserImage :: all()正在返回一个 Collection 的模型,您可以将其视为数组。您需要迭代集合,并在集合中的每个模型上调用 AlbumxUserImage()



可能会解决你现在的问题,但你似乎不明白多对多关系在Laravel工作。



你应该怎么做多对多



我不知道为什么你有一个模型的你的数据透视表。这不是Laravel如何处理具有多对多关系的模型。与您的表格的典型的多对多关系如下所示:



模型:

  class Album extends Model {
protected $ table ='album';
protected $ primaryKey ='album_id';

public function images(){
return $ this-> belongsToMany('App\UserImage','albumxuser_image','album_id','user_image_id');
}
}

class UserImage extends Model {
protected $ table ='user_image';
protected $ primaryKey ='user_image_id';

public function albums(){
return $ this-> belongsToMany('App'\\Album','albumxuser_image','user_image_id','album_id');
}
}

用法: >

  //通过UserImage获取所有相册名称
$ userImages = UserImage :: all() ;
foreach($ userImages as $ userImage){
foreach($ userImage-> albums as $ album){
echo $ album-> name;
}
}

//通过相册获取所有图片
$ albums = Album :: all();
foreach($ albums as $ album){
foreach($ album-> images as $ image){
echo $ image-> value;
}
}


I'm trying to create a many to many relationship using Laravel, but I am stuck.

Here's my current table model:

album

album_id
name
created_at

user_image

user_image_id
value

albumxuser_image (junction table)

albumxuser_image_id (primary key & auto increment)
album_id (FK from album)
user_image_id (FK from user_image)

I want to be able to get the album name from albumxuser_image table.

Here's what I've done so far.

Album.php model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Album extends Model {

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

    public function AlbumxUserImage() {
        return $this->belongsToMany('AlbumxUserImage', 'albumxuser_image','album_id','user_image_id');
    }
}

routes.php (I didn't use view since I'm making a practice)

Route::get('all', function() {
    $albumxuserimage = AlbumxUserImage::all();
    foreach ($albumxuserimage->AlbumxUserImage as $getthem) {
        echo $getthem->pivot->name; // I want to get the name column of the album table.
    }
});

AlbumxUserImage.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class AlbumxUserImage extends Model {

    protected $table = 'albumxuser_image';
    protected $primaryKey = 'albumxuser_image_id';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['album_id', 'user_image_id'];
}

Here's the error I get

Call to undefined method Illuminate\Database\Eloquent\Collection::AlbumxUserImage()

解决方案

You're trying to call AlbumxUserImage() on a Collection of models instead of on each individual model.

AlbumxUserImage::all() is returning a Collection of models, which you can think of as an array. You need to iterate over the collection and call AlbumxUserImage() on each model in the collection.

That may solve your problem for now, but you seem to not understand how many-to-many relationships work in Laravel.

How you should be doing Many-To-Many

I don't know why you have a model for your pivot table. That is not how Laravel normally handles models with many-to-many relationships. A typical many-to-many relationship with your tables would look like this:

Models:

class Album extends Model {
    protected $table = 'album';
    protected $primaryKey = 'album_id';

    public function images() {
        return $this->belongsToMany('App\UserImage', 'albumxuser_image','album_id','user_image_id');
    }
}

class UserImage extends Model {
    protected $table = 'user_image';
    protected $primaryKey = 'user_image_id';

    public function albums() {
        return $this->belongsToMany('App\Album', 'albumxuser_image','user_image_id','album_id');
    }
}

Usage:

// Get all album names through UserImage
$userImages = UserImage::all();
foreach ($userImages as $userImage) {
    foreach ($userImage->albums as $album) {
        echo $album->name;
    }
}

// Get all images through Album
$albums = Album::all();
foreach ($albums as $album) {
    foreach ($album->images as $image) {
        echo $image->value;
    }
}

这篇关于Laravel很多到很多关系使用雄辩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆