Лучший способ соединения с принадлежащими имеет много отношения в Laravel - PullRequest
0 голосов
/ 01 мая 2019

поэтому у меня есть код, который показывает весь мой продукт

                              @foreach($products as $product)
                            <div class="col-lg-4 col-md-4 col-sm-6 col-12 event-item-col ">
                                <div class="card card-event info-overlay">
                                    <div class="img has-background h-50">
                                        <div class="pop-info ">
                                            <span class="event-badges ">
                                                <span class="badge price-tag big badge-default">{{$product->price}}</span>
                                            </span>
                                        </div>
                                        <a href="/product/{{$product->id}}" class="event-pop-link">
                                            <span class="event-badges ">
                                            <span class="badge badge-danger"> if he buy</span>
                                            </span>
                                            <div class="event-pop-info">
                                                <p class="badge">{{$product->price}}</p>
                                                <p class="publisher">by <strong><?php $id = $product->user_id; $users = $user->findOrFail($id); echo $users->first; ?> <?php echo $user->last ?></strong></p>
                                            </div>
                                        </a>
                                        <a href="event-details.html">
                                            <img alt="340x230" class="card-img-top img-responsive h-100" data-holder-rendered="true" src="image/products/product{{$product->id}}.jpg"> </a>
                                        </div>
                                        <div class="card-body h-50">
                                            <h4 class="card-title">
                                                <a href="/product/{{$product->id}}">{{$product->pname}}</a>
                                            </h4>
                                            <p class="card-tex" style="overflow: hidden">{{$product->smalldescription}}</p>
                                            <div class="card-event-info">
                                                <p class="event-location"><i class="fas fa-location-arrow"></i>
                                                    <a class="location" href="/user/product/{{$id}}"><?php echo $users->first; ?> <?php echo $user->last ?></a></p>
                                                <p class="event-time"><i class="fas fa-calendar-alt"> {{$product->created_at->format('m/d/Y')}}</i></p>
                                            </div>
                                        </div>
                                </div>
                             </div>
                           @endforeach

а это мой контроллер

    public function index()
{
    $user = User::find(1);
    $products = product::orderBy('created_at', 'desc')->Paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null);
    return view('welcome', compact('products', 'user'));

}

как вы можете видеть на мой взгляд, у меня есть этот код

<?php $id = $product->user_id; $users = $user->findOrFail($id); echo $users->first; ?> <?php echo $user->last ?>

, который позволяет мне получить имя пользователя, который создает этот продукт, таблица продукта и пользователя имеет слишком много взаимосвязей. Я хочу изменить этот код на лучший и меньший код.

product->user->first

не работает. Я пробовал так много способов, но это просто не работает. если кто-нибудь может помочь мне получить данные с laravel способом, я буду благодарен. (извините, если мой вопрос дублируется, я пробовал так много способов, но ничего не вышло) чтобы дать вам больше информации, это мой класс

class User extends Authenticatable
{
use Notifiable;
use Friendable;

protected $fillable = [
    'first','last', 'email', 'password','phone','question','answer','description',
];

protected $hidden = [
    'password', 'remember_token',
];


public function products()
{

    return $this->hasMany(Product::class);

}

}  

и класс продукции:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

the class product extends Model
{

protected $fillable = [
    'part_id', 'smalldescription', 'description', 'pname', 'link', 'price',
];

public function users()
{

    return $this->belongsTo(User::class);

}





}

1 Ответ

2 голосов
/ 01 мая 2019

Во-первых, я хотел бы отметить, что вы уже определили отношение в своей модели продукта, которое вы можете использовать для доступа к связанному пользователю, вызвав функцию.Я также хотел бы предложить вам изменить имя функции в вашей модели продукта с пользователей на пользователя, так как assignTo возвращает только один экземпляр связанной модели.

public function user()
{
  return $this->belongsTo(User::class);
}

Возвращаясь к вашему запросу при запросе продуктов, используйте с загрузкой отношения, как в вашем случае.

product::with('user')->orderBy('created_at', 'desc')->Paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null);

Затем внутри цикла foreach на блейде получите имя пользователя, вызывающеепользовательская функция на $ product, такая как:

$product->user->name

Я бы также предложил еще раз просмотреть документацию laravel о красноречивых отношениях. Запрос отношения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...