Pasé por algunos temas similares pero no encontré la solución de trabajo. La mayoría de las veces no entendía bien el concepto. Tengo una base de datos simple con la siguiente estructura:

QUESTIONS
qid
question

TAGS
tagid
tag name

QUESTION_TAGS
qid
tagid

Mi modelo de pregunta:

class Question extends Model
{
    protected $table="questions";

    public function tags()
    {
        return $this->hasMany('App\Question_tags','qid','qid');
    }

}

Mi modelo de Etiquetas:

class Tags extends Model
{
    protected $table="tags";
}

Modelo de Question_tags:

class Question_tags extends Model
{
    protected $table="question_tags";
}

Controlador de preguntas:

class QuestionCtrl extends Controller
{

    public function getquesdet(){
        $id = Request::input('id');

        $question = Question::where('q_id','=',$id)->with('tags')
        ->get();

        return $question;      
  }
 };

Como se esperaba, el valor devuelto consta de ids. entonces, quiero que el valor devuelto sea tag names. Me encantaría escuchar alguna explicación.

1
uttejh 13 dic. 2016 a las 13:53

2 respuestas

La mejor respuesta

Al mirar sus esquemas de base de datos, es un many-to-many relación, por lo que su función de relación debe ser como:

En el modelo Question:

public function tags()
{
    return $this-> belongsToMany('App\Tags', 'QUESTION_TAGS', 'qid', 'tagid');
}

En el modelo Tags:

public function questions()
{
    return $this-> belongsToMany('App\Question', 'QUESTION_TAGS', 'tagid', 'qid');
}

Luego, en su controlador, puede escribir como:

$question = Question::where('q_id','=',$id)->with('tags')->first();

return $question->tags->pluck('name'); // returns array of tag names

Nota: no es necesario definir un modelo para la tabla dinámica Question_tags.

2
Amit Gupta 13 dic. 2016 a las 14:27

Hola en su ejemplo, está tratando de establecer una relación de muchos a muchos entre preguntas y etiquetas, y su base de datos se ve bien. pero en sus modelos ha hecho una función relacional para poblar datos relacionados con el problema en esas funciones. tu modelo de pregunta es

class Question extends Model
{
protected $table="questions";

public function tags()
{
    return $this->hasMany('App\Question_tags','qid','qid');
}

}

En esto estás usando la función hasMany que se usa para hacer la relación de 1 a muchos.

Utilice la función belongsToMany para hacer la relación de muchos a muchos.

1
vinod rajput 13 dic. 2016 a las 13:23