Laravel hasOneThrough ();значение пользовательского столбца промежуточной таблицы - PullRequest
0 голосов
/ 15 октября 2019

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

У меня есть три пользовательские таблицы:

> app_expressions;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| expression | varchar(191)     | NO   |     | NULL    |                |
| bot        | int(10) unsigned | NO   | MUL | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

> app_links;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| source      | varchar(10)      | NO   | MUL | NULL    |                |
| destination | varchar(10)      | NO   | MUL | NULL    |                |
| sid         | int(10) unsigned | NO   | MUL | NULL    |                |
| did         | int(10) unsigned | NO   | MUL | NULL    |                |
| bot         | int(10) unsigned | NO   | MUL | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

> app_replies;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| reply | text             | NO   |     | NULL    |                |
| bot   | int(10) unsigned | NO   | MUL | NULL    |                |
+-------+------------------+------+-----+---------+----------------+

app_expressions подключен к app_replies через app_links


Предположим, у меня есть одна запись в каждой таблице.

  • app_expressions.id такой же, как в app_links.sid, где app_links.source = 'expression'
  • app_replies.idто же самое, что и в app_links.did, где app_links.destination = 'reply'

Используя Laravel hasOneThrough(), как я могу получить доступ к ответу app_expressions от app_replies до app_links с условием app_links.destination = 'reply'? Псевдокод ниже:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Expressions extends Model
{
    /*
    *   Table
    */
    protected $table = 'app_expressions';

    /*
    *   Get all replies linked with this record
    */
    public function get_reply()
    {
        return $this -> hasOneThrough(
            'App\Replies',
            'App\Links',
            'did',  // Destination ID
            'id',  
            'id',
            'sid'   // Source ID
        ) -> where('intermediary table.destination', '=', 'reply') ;
    }
}

Надеюсь, я хорошо это объяснил.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Решено! Мне пришлось использовать конкретные методы сводной таблицы. Вот код для справки.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Expressions extends Model
{
    /*
    *   Table
    */
    protected $table = 'app_expressions';

    /*
    *   Get all replies linked with this record
    */
    public function get_reply()
    {
        return $this -> belongsToMany(
                            'App\Replies', // The destination table (app_replies)
                            'app_links',  // The pivot table; It can take a Model as argument as well (app_links)
                            'sid',        // Foreign key on pivot table (app_expressions.id on app_links.sid)
                            'did',        // Wanted key on pivot table (app_replies.id on app_links.did)
                            'id',         // Foreign key (app_expressions.id)
                            'id'          // Wanted key (app_replies.id)
                        )         

                        -> wherePivot('destination', 'reply'); // app_links.destination = 'reply'

    }

Философия: Я получаю доступ к записям с app_replies, через app_links, используя app_expressions, если app_links.sid = app_expressions.id и app_links.destination = 'reply'. Протестированный код для повозки ниже:

$app = new App\Expressions;

$expression = $app -> first();

$reply = $expression -> get_reply;

Для получения дополнительной информации я рекомендую искать параметры методов, объявленных в \Illuminate\Database\Eloquent\Relations\BelongsToMany\HasRelationship

0 голосов
/ 15 октября 2019

в вашем коде при запросе вы можете использовать WhereHas для фильтрации вашей таблицы на основе фильтра сквозной таблицы, например:

$str='reply';
$data=Expressions::whereHas('get_reply',function($q) use($str){
$q->where('app_links.destination',$str);
})->get();

и не забудьте удалить эту строку в модели выражений:

-> where('intermediary table.destination', '=', 'reply') ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...