亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Eloquent 從兩個不同的表中檢索數據

如何使用 Eloquent 從兩個不同的表中檢索數據

PHP
素胚勾勒不出你 2021-11-05 16:06:01
我正在設置一個系統來檢查用戶是否向另一個用戶發送了消息。消息控制器.phpuse App\Message;use App\User;class MessagesController extends Controller{    public function index()    {        return view('admin.messages')->with('messages', Message::all())                                     ->with('users', User::all());    }消息遷移有以下數據:Schema::create('messages', function (Blueprint $table) {    $table->increments('id');            $table->integer('from');            $table->integer('to');            $table->mediumText('text');            $table->integer('status');            $table->timestamps();});和 web.phpRoute::get('/admin/messages', [        'uses' => 'MessagesController@index',        'as' => 'messages'    ]);所以我們的想法是呈現一個帶有消息數據的面板,顯示:<tbody>    <tr>        @foreach ($messages as $message)        <td>            {{ $message->from}}        </td>        <td>            {{ $message->to}}        </td>        <td>            {{ $message->text}}        </td>        <td>            {{ $message->status}}        </td>        <td>            {{ $message->created_at}}        </td>        @endforeach    </tr></tbody>這將正確加載 Message 表上的所有信息。但是,它會顯示“from”和“to” as 和 ID,因為它應該。我希望通過 Message 表和 Users 表之間的關系填充該表,而不是用戶的 ID,而是用戶的名稱。我錯過了什么?
查看完整描述

2 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

首先,您需要定義您的關系??雌饋?aUser有很多Messages,所以:


消息.php


public function sender()

{

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

}


public function receiver()

{

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

}

注意:這里我使用了兩個帶有自定義外鍵的belongsTo關系,這是因為 Laravel{model}_id默認會查找列,但這樣 Laravel 將知道要搜索的列。


然后在您的控制器中,您可以返回您的消息,但Eager Loading您需要的關系以便能夠在您的視圖中顯示它們:


use App\Message;

use App\User;


class MessagesController extends Controller

{

    public function index()

    {

        $messages = Message::with(['sender', 'receiver'])->get();


        return view('admin.messages')->with('messages', $messages);


    }

}

那么在你看來:


<tbody>

<tr>

    @foreach ($messages as $message)

        <td>

            {{ $message->sender->name}}

        </td>

        <td>

            {{ $message->receiver->name}}

        </td>


        // ...


    @endforeach

</tr>

</tbody>

觀察

鑒于主鍵是正整數,請將外鍵類型更新為:


Schema::create('messages', function (Blueprint $table) {

        $table->increments('id');

        $table->unsignedInteger('from'); // <-----

        $table->unsignedInteger('to');  // <------

        $table->mediumText('text');

        $table->integer('status');

        $table->timestamps();

    });

這將幫助您避免將來出現一些麻煩。此外,在 Laravel 中5.8,主鍵默認為 Big Increments。所以如果你使用這些,你的外鍵應該是這樣的:$table->unsignedBigIncrement('column_name');


查看完整回答
反對 回復 2021-11-05
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

在您的消息模型中,您必須定義關系。我們定義了 from 和 to 關系,這些將需要一個額外的參數來定義鍵名,因為它不是您遵循的 Laravel 標準的一部分。


public class Message

{

    public function from()

    {

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

    }


    public function to()

    {

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

    }

}

完成此操作后,您將能夠執行類似的操作。


public function index()

{

    return view('admin.messages')->with('messages', Message::all())

}

如果像這樣訪問用戶 $message->from,您將獲得一個對象。如果您訪問該方法,您將獲得查詢構建器,例如 $message->from()。


現在您可以在刀片模板中使用它。


<tbody>

  <tr>

    @foreach ($messages as $message)

      <td>

        {{ $message->from->name}}

      </td>

      <td>

        {{ $message->to->name}}

      </td>


      ....

    @endforeach

  </tr>

</tbody>


查看完整回答
反對 回復 2021-11-05
  • 2 回答
  • 0 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號