Laravel 7 Отношения - PullRequest
       0

Laravel 7 Отношения

0 голосов
/ 05 апреля 2020

Привет, ребята, я новичок в использовании Laravel, теперь я работаю с Laravel 7.2.1.

У меня есть три таблицы:

Таблица пользователей: идентификатор, имя, адрес электронной почты.

Таблица магазинов: id, nome_negozio.

Таблица user_has_shops: shop_id, user_id.

Я хочу визуализировать пользователей и соответствующие магазины, в которых они зарегистрированы.

Я уже установил отношения в пользовательской модели:

public function shops()
    {

        return $this->belongsToMany(Shop::class);
    }     

Вместо этого в магазине моделей я поставил это:

public function users()
    {
        return $this->belongsToMany(User::class);
    }

Я не понимаю, как их правильно использовать, я установил свой пользовательский контроллер:

public function index(Request $request)
{


    if ($request->ajax()) {
        $data = User::latest()
                  ->leftJoin('user_has_shops', 'user_has_shops.user_id', '=', 'users.id')
                  ->leftJoin('shops', 'shops.id', '=', 'user_has_shops.shop_id')
                  ->select('users.*', 'shops.nome_negozio')
                  ->get();

        return Datatables::of($data)
                ->addIndexColumn()
                ->addColumn('roles', function($row){

                    $btn = '<label class="badge bg-orange">Nessun Ruolo Assegnato</label>';                                        

                        foreach($row->getRoleNames() as $ruoli_assegnati){

                        $btn = '<label class="badge bg-teal">'.$row->getRoleNames()->implode(' , ').'</label>';


                        }

                    return $btn;
                })
                ->addColumn('shops', function($row){

                    //$btn = '<label class="badge bg-orange">Nessun Negozio Assegnato</label>'; 

                        $btn = '<label class="badge bg-teal">'.$row->nome_negozio
                        .'</label>';



                    return $btn;
                })
                ->addColumn('action', function($row){

                    $btn = '<div class="btn-group" role="group">
                                            <div class="btn-group" role="group">
                                                <button type="button" class="btn btn-danger waves-effect dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                                                    Azioni
                                                    <span class="caret"></span>
                                                </button>
                                                <ul class="dropdown-menu">                                                       
                                                    <li><a href="#" class="show-modal" data-id="'.$row->id.'" data-nome="'.$row->name.'" data-email="'.$row->email.'"  data-ruoli="'.$row->getRoleNames()->implode(' , ').'">Visualizza</a></li> 
                                                    <li><a href="'.route('users.edit',$row->id).'">Modifica</a></li>
                                                    <li><a href="#" class="delete-modal" data-id="'.$row->id.'" data-title="'.$row->name.' - '.$row->email.'">Elimina</a></li>                                                           
                                                </ul>
                                            </div>
                                        </div>';    


                        return $btn;
                }) 
                ->rawColumns(['roles','shops','action'])
                ->make(true);
    }

    return view('users.index');
}

Результат такой : введите описание изображения здесь

Как видите, ID 38 имеет два магазина, но он записан в двух разных строках, а не в одном. Я хочу лучше понять, как использовать такого рода отношения.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

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

$data = User::latest()->with('user_has_shops');

Вам также необходимо создать другую модель для таблицы user_has_shops и добавить следующую функцию:

public function shop()
{

    return $this->belongsTo(Shop::class);
}     

И в вашей модели магазина вы должны добавить :

public function user_shops()
{

    return $this->hasMany(UserHasShop::class);
}     
0 голосов
/ 06 апреля 2020

Прежде всего, попробуйте использовать laravel соглашение об именах. Ваше имя сводной таблицы должно быть user_shop.

Тогда вы можете получить магазины пользователя следующим образом:

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