【问题标题】:How to display parent name in Laravel如何在 Laravel 中显示父级名称
【发布时间】:2020-02-24 09:45:02
【问题描述】:

我在 db 中有一个部门表,其中包含 id、名称和父级。父级是对应于父根的 id。现在我已经显示了 id(父 id),但我想显示部门的名称与此 id 相对应。我已尝试在部门控制器,索引功能上进行查询,但它给了我这个错误 照亮\数据库\查询异常 SQLSTATE[42000]: 语法错误或访问冲突: 1066 不是唯一的表/别名: 'departments' (SQL: select departments.id, departments.parent, departments.name from @ 987654327@ 内部连接 ​​departments on department.id = departments.parent 其中id = 父级)

DepartmentController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use  App\Department;
use  App\User;
use Illuminate\Support\Facades\DB;

class DepartmentController extends Controller
{  

  public function usersdep($id)
  {
   $department = Department::with('users')->find($id);
   return view('admin.page-users')->with('users', $department->users);
  } 
   public function treeView()
  {
   $departments = Department::with('childs')->where('parent', 0)->get();  
   return view('admin.page',compact('departments'));
  } 

  public function index()
  {
    //$departments = \App\Department::all();  
    //return view('admin.department')->with('departments', $departments);
 return $departments =  DB::table('departments')
    ->join('departments', 'department.id', '=', 'departments.parent')
   ->select('departments.id','departments.parent','departments.name')->where('id','=','parent')->get();
  }

department.blade.php

@extends ('layouts.master')

@section('title')
Department Management | Admin
@endsection
@section('content')

<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">New department</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
        @if (session('status'))
        <div class="alert alert-success" role="alert">
          {{ session('status') }}
        </div>
        @endif
      </div>
      <form action="/save-department" method="POST">
        {{   csrf_field() }}
        <div class="modal-body">         
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">Name</label>
            <input type="text" class="form-control" name="name" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">ID</label>
            <input type="text" class="form-control" name="id" id="recipient-id">
          </div> 
          <div class="form-group">
            <label for="recipient-name exampleFormControlSelect2" class="col-form-label">Parent ID</label>
            <input type="text" class="form-control" placeholder="Choose the department parent id"name="parent" id="recipient-parent">

            <select multiple class="form-control"  name="parent" id="recipient-parent">
            @foreach($departments as $department)
               <option>{{ $department->parent }}</option>
               @endforeach 
            </select>

          </div>          
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="submit" class="btn btn-primary">Save</button>
        </div>
      </form>
    </div>
  </div>
</div>
<div class="row">
  <div class="col-md-12">
    <div class="card">
      @if (session('status'))
      <div class="alert alert-success" role="alert">
        {{ session('status') }}
      </div>
      @endif
      <div class="card-header">
        <h4 class="card-title my-4 text-center font-weight-light"> Department Management </h4>
      </div>
      <div class="card-body">
        <div class="table-responsive">
          <table class="table">
            <thead class=" text-primary">
              <th>Department</th>
              <button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#exampleModal" >Add</button>              
              <thead class=" text-primary">
                <th>ID</th>
                <th>Name</th>
                <th>Parent ID</th>
                <th>Edit</th>
                <th>Delete</th>
              </thead>
            </thead>
            <tbody>
              @foreach($departments as $department)
              <tr>
                <td>{{ $department->id }}</td>  
                <td>{{ $department->name }}</td>  
                <td>{{ $department->parent }}</td> 
                <td>
                  <a href="{{  url('department-edit/'.$department->id) }}" class="btn btn-success">Edit</a>
                </td>       
                <td>
                  <form action="{{  url('department-delete/'.$department->id) }}" method="POST">
                    {{ csrf_field() }}
                    {{ method_field('DELETE') }}
                    <button type="submit"  class="btn btn-danger">Delete</button>
                  </form>                           
                </td>               
              </tr> 
              @endforeach  
              <a href="{{  url('/page') }}" class="btn btn-success">See the Departments and Employees</a>                                                     
            </tbody>           
          </table>  
        </div>
      </div>
    </div>
  </div>


  @endsection


  @section('scripts')


  @endsection

web.php

<?php
use App\User;
use App\Department;

use App\Events\WebsocketDemoEvent;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    broadcast(new WebsocketDemoEvent('some data'));
    return view('welcome');
});
Route::get('/page', function () {
    return view('admin.page');
});
Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::group(['middleware' => ['auth','admin']], function  () {
    Route::get('/role-register','Admin\DashboardController@registered');
    Route::delete('/role-delete/{id}', 'Admin\DashboardController@registerdelete');//delete user
    Route::post('/save-user', 'Admin\DashboardController@store');

    Route::get('/department', 'Admin\DepartmentController@index');
    Route::post('/save-department', 'Admin\DepartmentController@store');
    Route::get('/department-edit/{id}', 'Admin\DepartmentController@edit');//edit department
    Route::put('/department-update/{id}', 'Admin\DepartmentController@update');
    Route::delete('/department-delete/{id}', 'Admin\DepartmentController@delete');//delete department  

    Route::get('/page-users/{id}', 'Admin\DepartmentController@usersdep');//show users  


});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');

Route::get('/chats', 'ChatsController@index');//chats
Route::get('/messages', 'ChatsController@fetchMessages');//messages
Route::post('/messages', 'ChatsController@sendMessage');//messages

Route::get('/dashboard', 'Admin\DashboardController@dbcheck');//DATABASE
Route::get('/user-edit/{id}', 'HomeController@registeredit');
Route::get('/role-edit/{id}', 'Admin\DashboardController@registeredit');//edit user
Route::put('/role-register-update/{id}', 'Admin\DashboardController@registerupdate');

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');


Route::get('store_image', 'StoreImageController@index');
Route::post('store_image/insert_image', 'StoreImageController@insert_image');
Route::get('store_image/fetch_image/{id}', 'StoreImageController@fetch_image');
Route::get('/page',array('as'=>'jquery.treeview','uses'=>'Admin\DepartmentController@treeView'));
Route::get('/pageusers', 'Admin\DepartmentController@usersdep');

部门.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Department extends Model
{
    protected $table = 'departments';
    protected $fillable = [
        'name',
    ];
    protected $primaryKey = 'id';

public function users()
{
   // return $this->belongsTo(User::class);
    return $this->hasMany(User::class,'department','id');
}

   //category has childs
   public function childs() {
    return $this->hasMany('App\Department','parent','id') ;
    /*
    childs() method with hasMany relationship. 
    hasMany relationship in Laravel tell us that they have multiple childs. 
    Here I am creating relationship based on parent and each category has their parent if parent id is 0 it means it is root category.*/
}
}

创建部门表

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateDepartmentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
public function up()
    {
        Schema::create('departments', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->integer('parent');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('departments');
    }
}

【问题讨论】:

  • 您必须通过parent_root.id 加入parent_id。然后你会得到parent的名字。
  • 我更新了我添加的问题加入但给了我一个错误
  • 在我的部门的数据库中 parent_id 被称为 parent
  • 你必须给我看两个表,否则,它会很混乱。你能把两张桌子都给我看看吗?
  • @k_lear 是的,然后将它们相应地更改为您的DB

标签: php laravel


【解决方案1】:

另一种答案

型号

Department 模型可能与一个父模型相关联。要定义此关系,请在模型上放置 parent 方法。 parent 方法应该调用hasOne 方法并返回其结果:

class Department extends Model
{
    protected $fillable = [
        'name',
        'parent_id',
    ];

    public function parent()
    {
        return $this->hasOne(Department::class, 'id', 'parent_id');
    }
}

迁移

Schema::create('departments', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->unsignedBigInteger('parent_id')->nullable();
    $table->timestamps();

    $table->foreign('parent_id')->references('id')->on('departments');
});

用法

定义关系后,您可以检索parent

$departments = Department::get();

foreach ($departments as $department) {
    if ($parent = $item->parent) {
        dd($department->name, $parent->name);
    }
    else{
        dd('This department is a parent')
    }
}

【讨论】:

    【解决方案2】:

    您需要传递正确的部门 ID。

    public function index()
    {         
         $departments =  DB::table('departments')->select('departments.*')->get();
         return view('admin.department', compact('departments'));
    }
    

    并查看:

    @foreach($departments as $department)
    <tr>
        <td>{{ $department->id }}</td>  
        <td>{{ $department->name }}</td> 
        @foreach($departments as $parent)
            @if( $department->parent === $parent->id )
                <td>{{ $department->name }}</td>
            @endif
        @endforeach
    <tr>
    @endforeach
    

    【讨论】:

      【解决方案3】:

      只需在部门模型中定义一个关系

      public function parentDepartment()
      {
          return $this->belongsTo(self::class, 'parent');
      }
      

      并在索引方法中加载它

      public function index()
      {
          $departments = Department::with('parentDepartment')->get();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 2019-05-29
        • 2019-06-14
        • 2021-12-27
        • 2018-12-05
        • 1970-01-01
        相关资源
        最近更新 更多