Anon3363
@Anon3363

Eloquent Laravel (многие ко многим) как получить данные через промежуточную таблицу?

Связаны модели Product и User через Feedback.
Нужно выбрать всех пользователей (User) которые оставили отзывы о товаре (Product), они указаны в Feedback.

5f213e77704ea990111171.png

public function users()
{
    	return $this->belongsToMany('App\Users','App\Feedback', 'user_id', 'id', 'user_id');
}
  • Вопрос задан
  • 1804 просмотра
Решения вопроса 2
Lyrium
@Lyrium
Web developer
Для более удобной работе c Eloquent стоит правильно формировать архитектуру.

В вашем случае правильнее будет создать промежуточную Pivot модель с описанием необходимых связей (users, products).

class Feedback extends Pivot
{
    public function users()
    {
        return $this->belongsTo(User::class);
    }

    public function products()
    {
        return $this->belongsTo(Product::class);
    }
}


затем уже в моделях Пользователя или Товара используйте эту pivot-model для создания правильной связи.

class User extends Authenticatable
{
...

    public function products()
    {
        return $this->belongsToMany(Product::class,
            'feedback', 'user_id', 'product_id')
            ->using(Feedback::class)
            ->withTimestamps();
    }
}

class Product extends Model
{
...

    public function users()
    {
        return $this->belongsToMany(User::class,
            'feedback', 'product_id', 'user_id')
            ->using(Feedback::class)
            ->withTimestamps();
    }
}
Ответ написан
Комментировать
@Barmunk
Можно получить данные по цепочке через точку или с помощью join

class Listing extends Eloquent
{
    public function model()
    {
        return $this->belongsTo('Model', 'model_id');
    }
}

class Model extends Eloquent
{
    public function manufacturer()
    {
        return $this->belongsTo('manufacturer');
    }
}

class Manufacturer extends Eloquent
{
} 

$listings = Listing::with('model.manufacturer')->all();
foreach($listings as $listing) {
    echo $listing->model->manufacturer->name;
}


join можно добавить в новую связь

class Listing extends Eloquent
{
    public function model()
    {
        return $this->belongsTo('Model', 'model_id');
    }

     public function modelManufacturer()
    {
        return $this->belongsTo('Model', 'model_id')
                   ->join('.......')
                   ->select('manufacturer.*');
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы