Laravel - 多对多的关系

时间:2015-10-07 12:15:27

标签: php mysql laravel eloquent

我有2个表,用户图片。这些表具有多对多关系,我创建了一个数据透视表名称 user_pictures

users表如下:

id
firstname
lastname

图片表如下:

id
filename
url 

user_pictures表包含:

id
user_id
picture_id

当用户添加图片时,图片文件名 url 存储在图片表格中,以及 user_pictures中表格中该图片的 picture_id 与该用户的 user_id 一起存储。

如何检索与使用Eloquent ORM添加它们的用户相关的所有图片 filename url

2 个答案:

答案 0 :(得分:1)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'users';
    // Define pictures with a pivot table link
    public function pictures() {
        return $this->belongsToMany('App\Models\UserPicture', 'user_pictures', 'picture_id', 'user_id');
    }
    //add methods
}

class UserPicture extends Model
{
    protected $table = 'user_pictures';
    public function picture() {
        return $this->hasOne('App\Models\Picture', 'id', 'picture_id');
    }

    public function user() {
        return $this->hasOne('App\Models\User', 'id', 'user_id');
    }
    //add methods
}

class Pictures extends Model
{
    protected $table = 'pictures';
    //add methods
}

如果您不想为表添加时间戳,则必须添加以下两种方法:

 public function setCreatedAt($value) {
        // to disable created_at
    }

    public function setUpdatedAt($value) {
        // to disable created_at
    }

要从用户处获取图片,请执行以下操作:

$userPictures = UserPicture::where(array('user_id'=>1)->get();
foreach($userPictures as $userpicture) {
    $picture = $userpicture->picture();
}

答案 1 :(得分:0)

User模型中添加以下关系

public function pictures() 
{
    return $this->belongsToMany(App\Picture::class, 'user_pictures');
}

Picture模型中添加以下关系

public function users()
{
    return $this->belongsToMany(App\User::class, 'user_pictures');
}

然后获取与用户相关的所有图片

$pictures = $someUserObject->pictures;